mysqli连接无法使用mysqli_real_escape_string

时间:2018-02-02 00:13:29

标签: php sql mysqli

我正在试用一个简单的演示php脚本。我之前一直在使用已弃用的mysql_扩展,尝试从那里迁移到mysqli_正在过度错误。当试图使用mysqli_real_escape_string php throws a variable not defined error时似乎无法找出原因。

    <?php

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "bridgoo";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);


// Check connection
if ($conn->connect_error) {
  //do stuff
  }
// prepare and bind
$stmt = $conn->prepare("INSERT INTO bridgoo_users (username, email, password) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $username, $password, $email);


    //generate password hash using blowfish algorithm
   $password_hash =  password_hash($_POST['password'], PASSWORD_BCRYPT, ["cost" => 9]);

$username = clean_input($_POST['username']);
$password = clean_input($password_hash);
$email = clean_input($_POST['email']);


function clean_input($input){

    $input = htmlentities($input);
    $input = htmlspecialchars($input,ENT_QUOTES);
    $input = mysqli_real_escape_string($conn,$input);

    return $input;
}


$stmt->execute();
$stmt->close();
$conn->close();

?>
  

php error注意:未定义的变量:第24行的C:\ xampp \ server1 \ htdocs \ bridgoo \ inc \ register.php中的conn

3 个答案:

答案 0 :(得分:3)

关于undefined variable $conn的错误与PHP variable scope有关,而其他人已回答过这个错误。

但您的代码也需要其他一些建议。

如果您使用查询参数,则根本不需要清理输入。这是使用查询参数的重点:不需要mysqli_real_escape_string(),因为参数是自动安全的。

事实上,您不得使用mysqli_real_escape_string(),因为您的数据将使用\'转义撇号逐字插入您的数据库。

简单地说: SQL参数和mysqli_real_escape_string()是互斥的。别做这两件事。

此外,使用htmlentities()htmlspecialchars ()来清理SQL输入是没有意义的,即使您使用mysqli_real_escape_string()而不是参数。

这些与html相关的功能仅用于HTML输出。它们对于保护您的网络应用免受XSS vulnerabilities非常重要,这是您需要的另一个无关的网络安全风险知道关于。但是他们不需要消毒SQL输入。

其他评论:

  • 您为mysqli连接和应用程序数据重新使用用户名和密码变量感到困惑。没有理由重复使用变量,它们不会让您付出任何代价。
  • 确保INSERT中参数的顺序与传递给bind_param()的绑定变量的顺序一致。
  • 始终检查prepare()execute()的返回值。如果失败则返回FALSE。如果它们失败,您必须记录错误并向用户报告该页面不起作用。

    我更喜欢将技术错误消息记录到PHP错误日志中 文件,并向用户报告更友好的内容。

    养成在开发过程中保持窗口打开以查看PHP错误日志的习惯,它会为您提供很多帮助。

以下是我建议您编写代码的方式:

<?php

$mysql_servername = "localhost";
$mysql_username = "root";
$mysql_password = "";
$mysql_dbname = "bridgoo";

$conn = new mysqli($mysql_servername, $mysql_username, $mysql_password, $mysql_dbname);

if ($conn->connect_error) {
  error_log($conn->connect_error);
  die("Sorry, a database error occurred.");
}

$stmt = $conn->prepare("
  INSERT INTO bridgoo_users (username, password, email) 
  VALUES (?, ?, ?)");
if ($stmt === false) {
  error_log($conn->error);
  die("Sorry, a database error occurred.");
}

$stmt->bind_param("sss", $username, $password_hash, $email);

//generate password hash using blowfish algorithm
$password_hash = password_hash($_POST['password'], PASSWORD_BCRYPT, ["cost" => 9]);

$username = $_POST['username'];
$email = $_POST['email'];

if ($stmt->execute() === false) {
  error_log($conn->error);
  die("Sorry, a database error occurred.");
}

if ($stmt->affected_rows == 1) {
  echo "Success!"
} else {
  echo "Sorry, an unknown problem occurred, and your record was not saved."
}

答案 1 :(得分:0)

您的clean_input函数无法访问您的$conn变量,它位于不同的scope

简单的解决方案是将连接添加为函数的参数。像这样:

<?php
...


$username = clean_input($_POST['username'], $conn);
$password = clean_input($password_hash, $conn);
$email = clean_input($_POST['email'], $conn);


function clean_input($input, $conn){

...

这是最好的或最干净的解决方案,我将留在中间,但它应该工作得很好。

答案 2 :(得分:0)

您应将<a href='@Url.Action("About", "Home", new { foo = Model.Foo, bar = Model.Bar })'>About</a> 作为参数传递给您的函数$conn;

clean_input