php - mysqli 插入错误语法不正确

标签 php mysqli

我知道很多人偶尔会遇到同样的错误,但是我查看了以前的所有答案和我的代码,并且尝试了带或不带反引号的 col 这是我当前的代码 我也尝试过 $var以及 $var但相同

if(!empty($_POST['email'])){
 $date = date('dmY'); #Todays Date
 $ip = str_replace('.','',$_SERVER['REMOTE_ADDR']); #Visitor IP
 $verify = md5($date.$ip); #MD5 ENCRYPT THE 2 VALUES
 $fname = $_POST['fname'];
 $lname = $_POST['lname'];  
 $email = $_POST['email'];
 $password = md5($_POST['password']);
 $link = mysqli_connect($dbh,$dbu, $dbp, $dbn);

 $query = mysqli_query($link, "INSERT INTO `users` (`email`,`fname`,`lname`,`verify`,`password`,`joined`)
VALUES($email,$fname,$lname,$verify,$password,$date)");

 if($query){ 
  echo "inserted"; 
 }
 else { 
  echo mysqli_error($link);
 }

表中还有其他列,但我想添加数据的只有上面的列,其余列最初可以使用默认值

我已经研究这段代码很长时间了,现在我只是找不到我的问题,我知道它很愚蠢

最佳答案

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

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

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

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

然后,您必须准备它、绑定(bind)变量并执行:

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

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

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

这样,您始终可以确保添加到查询中的数据不会导致任何 SQL 语法错误!作为奖励,此代码也能抵御 SQL 注入(inject)!

了解仅仅在变量周围添加引号是不够的这一点非常重要,并且最终会导致无数问题,从语法错误到 SQL 注入(inject)。另一方面,由于准备好的语句的本质,它是一种万无一失的解决方案,使得不可能通过数据变量引入任何问题。

关于php - mysqli 插入错误语法不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48932755/

相关文章:

PHP - 移动到 AWS S3 后删除本地文件 - 文本文件忙错误

mysql - Sql:“哪里”和“与”

php - 将 phpmyadmin 国家/地区 ISO 代码转换为变量定义值 PHP

javascript - 从 SQL 数据库填充 HTML Div(项目)

php - 使用 MySQLi 时在非对象上调用成员函数 real_escape_string()

php - 返回 MYSQLi 准备语句查询并将结果绑定(bind)到一个数组

php - 如何将mysql改为mysqli?

php - SQL 连接具有不同内容的列

php - 扩展、修改或覆盖 Joomla 的 bootstrap.php?

javascript - 错误 JSON.parse : unexpected end of data at line 1 column 1 of the JSON data