我正在试用一个简单的演示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
答案 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输入。
其他评论:
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