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

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

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

检查错误消息后,我发现这个查询失败,错误说

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

我怎样才能正确地包含variables到SQL查询,使其运行没有错误?

  • 这个问题不是关于我很熟悉的SQL语法,而是关于使用PHP脚本中的variablesdynamic创build查询的规则。
  • 我不想要一个只消除即时错误的快速补丁,而是一个没有错误和安全的最先进的解决scheme。

将variables添加到SQL查询中的最有效的方法是通过准备好的语句添加variables。

理解这一点非常重要, 只需在variables上添加引号是不够的,并且最终会导致无数的问题,从语法错误到SQL注入。 另一方面,由于准备好的语句的本质,这是一个防弹解决scheme,使得不可能通过数据variables引入任何问题。

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

首先,你必须改变你的查询,添加占位符代替variables。 您的查询将成为:

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

然后,你将不得不准备它,绑定variables,并执行:

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

正如你所看到的,这只是三个简单的命令:

  • prepare()在哪里发送带有占位符的查询
  • bind_param在那里你发送一个string与types(“S”是为string,你可以用它实际任何types),而不是实际variables。
  • 和execute()

这样,您可以始终确保添加到查询中的数据不会导致单个SQL语法错误! 作为一个奖励,这个代码也是防SQL注入的!

尽pipe如此,使用mysqli预处理语句运行SELECT查询可能会更复杂。 所以我强烈build议selectPDO作为数据库驱动程序,原因很多 。