我正在尝试创建一个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);
Unknown column ‘John’ in ‘field list’
>这个问题不是关于我非常熟悉的sql语法,而是关于使用PHP脚本中的变量动态创建查询的规则.
>我不想要一个快速补丁,只消除了立即的错误,而且是一个无错误和安全的最先进的解决方案.
将变量添加到SQL查询中的最具防误的方法是通过准备语句添加变量.
原文链接:https://www.f2er.com/php/139352.html非常重要的是要明白,只需在变量上添加引号是不够的,最终会导致无数的问题,从语法错误到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注入的防弹!
有一点盐,虽然运行一个SELECT查询与MysqLi准备的语句可能会更复杂.所以我强烈建议选择PDO作为您的数据库驱动程序for many reasons.