一尘不染

mysqli insert error语法不正确

php

我知道很多人偶尔也会遇到相同的错误,但是我已经查看了所有先前的答案和我的代码,并且尝试了使用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);
 }

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

我一直在看这段代码很久了,现在我才发现问题,我知道这很愚蠢


阅读 241

收藏
2020-05-26

共1个答案

一尘不染

将变量添加到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注入!

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

2020-05-26