我一直在尝试将我的代码从MySQL转换为MySQLi。我试图保护sql注入。我学会了不使用pre_replace。我一直在尝试下面的代码中指定的不同选项。似乎唯一有效的其他选项是下面有mysql_escape_string的代码行。我已经尝试了mysql_real_escape_string和$ db-> real_escape_string,如下所示。但是,这会导致网站停止运行。我没有收到错误消息。我想知道为什么$ FName的第一行代码工作,以下两行代码不起作用。我花了大约2个小时尝试我能想到的一切。对不起,如果这个问题是基本的,但我找不到答案。任何帮助,将不胜感激。
<?php require "connect.php"; ?>
<?php
if(isset($_POST['Register'])) {
session_start();
$FName = mysql_escape_string($_POST['FirstName']);
$LName = mysql_real_escape_string($_POST['LastName']);
$Email = $db->real_escape_string($_POST['Email']);
$UName = preg_replace('#[^A-Za-z0-9]#i', '', $_POST ["UserName"]);
$PW = preg_replace('#[^A-Za-z0-9]#i', '', $_POST ["Password"]);
$sql = $con->query("INSERT INTO BD (FirstName, LastName, Email, UserName, Password) Values('{$FName}', '{$LName}', '{$Email}', '{$UName}','{$PW}')");
header('Location: login.php');
}
&GT;
答案 0 :(得分:2)
你在评论中说这是你的联系:
$con =new mysqli ("local host", "name", "PW", "users")
但您使用$db
作为$Email
的变量。那应该是$con
。
另外,local host
应该在一个单词localhost
中。
$con =new mysqli ("localhost", "name", "PW", "users")
检查错误时:
$con =new mysqli ("localhost", "name", "PW", "users");
if ($con->connect_error) {
die('Connect Error (' . $con->connect_errno . ') '
. $con->connect_error);
}
然后这些将永远不会起作用:
$FName = mysql_escape_string($_POST['FirstName']);
$LName = mysql_real_escape_string($_POST['LastName']);
正在混合使用MySQL API。那些不同的API /功能不会相互混合。您需要在连接到查询时使用相同的内容。
,包括:
$Email = $db->real_escape_string($_POST['Email']);
因此,整个块:
$FName = mysql_escape_string($_POST['FirstName']);
$LName = mysql_real_escape_string($_POST['LastName']);
$Email = $db->real_escape_string($_POST['Email']);
需要更改为:
$FName = $con->real_escape_string($_POST['FirstName']);
$LName = $con->real_escape_string($_POST['LastName']);
$Email = $con->real_escape_string($_POST['Email']);
将error reporting添加到文件的顶部,这有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:错误报告应仅在暂存时完成,而不是生产。