繁体   English   中英

如何在PHP脚本中正确构造SQL查询?

[英]How to construct an SQL query correctly in a PHP script?

我正在尝试创建一个SQL查询以将用户信息插入数据库。 $fname$lname变量包含正确的值(“ John”和“ Doe”),但是查询失败。 这是我的代码:

$fname = $_POST['first_name'];
$lname = $_POST['last_name'];  
$sql = "INSERT INTO users (fname, lname) VALUES ($fname, $lname)";
mysqli_query($conn, $sql);

检查错误消息后,我发现此查询失败,并显示错误信息

“字段列表”中的未知列“ John”

如何在SQL查询中正确包含变量以使其运行而不会出现错误?

  • 这个问题不是关于我非常熟悉的SQL语法,而是关于使用PHP脚本中的变量动态创建查询的规则。
  • 我不希望有一个仅消除即时错误的快速补丁,而是想要一个无错误且安全的最新解决方案。

将变量添加到SQL查询中的最防错的方法是通过准备好的语句添加变量。

理解仅在变量周围加上引号是不够的 ,这将非常重要,并最终会导致无数问题,从语法错误到SQL注入。 另一方面,由于预准备语句的本质,它是一种防弹解决方案,无法通过数据变量引入任何问题。

因此,对于您运行的每个查询,如果至少要使用一个变量,则必须用占位符替换它,然后准备查询,然后执行它,并分别传递变量。

首先,您必须更改查询,在变量中添加占位符。 您的查询将变为:

$sql = "INSERT INTO users (fname, lname) VALUES (?, ?)";

然后,您将必须准备它,绑定变量并执行:

$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "ss", $fname, $lname);
mysqli_stmt_execute($stmt);

如您所见,这只是三个简单的命令:

  • prepare()您使用占位符发送查询的位置
  • 在bind_param中,您发送带有类型的字符串(“ s”用于字符串,并且可以将其实际用于任何类型),而不是实际变量。
  • 和execute()

这样,您始终可以确保添加到查询中的数据不会引起单个SQL语法错误! 另外,此代码还可以防止SQL注入!

不过有一点麻烦,因为使用mysqli准备好的语句运行SELECT查询可能会更加复杂。 因此, 出于多种原因,我强烈建议选择PDO作为数据库驱动程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM