2017-02-19 95 views
10

我想创建一个SQL查询插入用户信息到数据库中。 $fname$lname变量包含正确的值(“John”和“Doe”),但查询失败。这里是我的代码:如何在PHP脚本中正确构建SQL查询?

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

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

未知列“约翰”在“字段列表”

后如何正确地将变量包含到SQL查询中以使其无误地运行?

  • 这个问题不是关于我熟悉的SQL语法,而是关于在PHP脚本中动态使用变量创建查询的规则。
  • 我不想要一个只消除即时错误的快速修补程序,而是一种无错误且安全的最新解决方案。
+3

我明白你正在尝试设置一些权威的复制目标,但是“失败”从来没有成为一个有效的问题陈述。您需要扩展问题的描述,并指出在什么情况下会生成语法错误,并且(理想情况下)包含文本表示的实际错误,以便人们可以通过Google找到此问题,而不是其他任何其他人, *包含真实的错误消息。 – meagar

+0

[在MySQL中何时使用单引号,双引号和反引号]可能有重复(http://stackoverflow.com/questions/11321491/when-to-use-single-quotes-double-quotes-and-backticks- in-mysql) –

+0

“字段列表中的未知列'hello'” - 这怎么可能? –

回答

8

最防呆的方式来添加一个变量到一个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”是为字符串,你可以用它实际上任何类型)一个nd比实际变量。
  • 和执行()

这样,你总是可以肯定,没有一个SQL语法错误可以由您添加到查询的数据造成的!作为奖励,这个代码也是防SQL注入的!

尽管如此,使用mysqli预处理语句运行SELECT查询可能会更加复杂。所以我强烈建议选择PDO作为您的数据库驱动程序for many reasons

+16

*“将变量添加到SQL查询的唯一正确方法是通过准备好的语句添加它。”* - 假,您知道它。 –

+7

@ Fred-ii-实际的东西应该说“你不太可能犯错的唯一方式”,但它似乎是对读者智力的侮辱。 – Braiam

+0

@布赖安怎么样“最防错的方法”? – dorukayhan