Php mysqli插入错误语法不正确

Php mysqli插入错误语法不正确,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 ENCRYP

我知道很多人偶尔也会犯同样的错误,但是我已经看过了所有以前的答案和我的代码,并且我尝试了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 (?, ?)";
然后,您必须准备、绑定变量并执行:

$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "ss", $fname, $lname);
mysqli_stmt_execute($stmt);
如您所见,它只是三个简单的命令:

  • prepare()用于发送带有占位符的查询
  • bind_param,其中发送类型为(“s”表示字符串,实际上可以用于任何类型)且不包含实际变量的字符串
  • 并执行()
这样,您可以始终确保添加到查询中的数据不会导致任何SQL语法错误!作为奖励,这段代码也可以防止SQL注入


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

因为uid是自动递增的,所以它不是密码,我正在创建一个验证字符串。。忽略实际列名所说的内容。。我们可以只关注实际问题吗请您的查询将缺少值(
。$email',“$fname'…”
)的引号。但是您很容易进行SQL注入。使用带有参数化查询的准备语句一个名为password的列一个名为password的列通常用于存储“password”“尽管您希望找到问题的解决方案,但如果不向您指出最佳做法,人们将不会乐于帮助您。正是我希望有人发布的内容,我尝试了准备好的语句,但无法使其工作,因此我返回到一个基本查询(bindparam出现问题,无法工作)将接受答案。现在给出警告:mysqli_stmt_bind_param()希望参数1是mysqli_stmt,布尔givenSo检查以确保第一个参数实际上是您的
$语句
变量,如果您声明了它。这意味着您的查询中仍然存在错误。字段的数量应等于占位符的数量,语法应正确$sql=“插入
用户
(电子邮件、fname、lname、验证、密码、连接)值(?,,,,,,?)”;$stmt=mysqli\u prepare($con,$sql);mysqli_stmt_bind_param($stmt,“ssssss”、$email、$fname、$lname、$verify、$password、$date);所有匹配项都匹配,我甚至删除了uid列,所以只有6个列添加了数据,并且有6个占位符