mysql_real_escape_string函数不起作用

时间:2015-07-19 23:42:01

标签: php mysqli

我一直在尝试将我的代码从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;

1 个答案:

答案 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

旁注:错误报告应仅在暂存时完成,而不是生产。

相关问题