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

You*_*nse 9 php sql

我正在尝试创建一个SQL查询以将用户信息插入到数据库中.在$fname$lname变量包含正确的值("约翰"和"李四"),但查询失败.这是我的代码:

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

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

"字段列表"中的未知列"John"

如何正确地将变量包含到SQL查询中以使其在没有错误的情况下运行?

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

You*_*nse 8

将变量添加到SQL查询中最容易出错的方法是通过预准备语句添加它.

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

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

首先,您必须更改查询,添加占位符代替变量.您的查询将变为:

$sql = "INSERT INTO users (fname, lname) VALUES (?, ?)";
Run Code Online (Sandbox Code Playgroud)

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

$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "ss", $fname, $lname);
mysqli_stmt_execute($stmt);
Run Code Online (Sandbox Code Playgroud)

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

  • prepare()您使用占位符发送查询
  • bind_param,你发送一个带有类型的字符串("s"用于字符串,你可以将它实际用于任何类型)和实际变量.
  • 和执行()

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

虽然有一小撮盐,因为使用mysqli预处理语句运行SELECT查询可能会更复杂.所以我强烈建议选择PDO作为数据库驱动程序,原因有很多.

  • *"将变量添加到SQL查询中的唯一正确方法是通过预准备语句添加它."* - 错误,你知道. (16认同)
  • @ Fred-ii-实际应该说"你不太可能出错的唯一方法",但这似乎是对读者智慧的侮辱. (7认同)