当前位置: 首页 > 面试题库 >

mysqli insert error语法不正确

薛英卫
2023-03-14
问题内容

我知道很多人偶尔也会遇到相同的错误,但是我已经查看了所有先前的答案和我的代码,并且尝试了使用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”用于字符串,并且可以将其实际用于任何类型),而不是实际变量。
  • 和execute()

这样,您始终可以确保添加到查询中的数据不会引起单个SQL语法错误!另外,此代码还可以防止SQL注入!

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



 类似资料:
  • 我正在尝试用Selenium在Java中创建ajax wait方法,以获取配置所定义的尽可能多的结果。 我是否应该担心XPath表达式不是snytax正确的,或者Selenium找不到那个webelement?这个例外对我来说是模棱两可的....

  • 打开和关闭连接: 注册用户 错误消息 '/'应用程序中的服务器错误。 INSERT INTO语句中存在语法错误。 描述:在执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的起源的更多信息。 异常详细信息:系统。数据。OleDb。OleDbException:INSERT INTO语句中的语法错误。 源错误: 第100行:命令。ExecuteNonQuery();第1

  • 在执行此SQL脚本时,我得到以下错误:

  • 问题内容: 我是学生,这是家庭作业…表格在那里,但没有插入数据。 感谢您的任何建议 SQL语句: 问题答案: 您在其中没有子句(“ Ledonna”之后的子句) 请注意,如果您双击Management Studio中的错误消息,它将带您进入代码的问题位。

  • 我在这个Batch脚本中有一个语法错误,但我不知道它是从哪里来的。我是批处理新手,所以我很难弄清楚这一点。我感觉这与语句有关,但我不确定。 我得到的当前错误是: 该命令的语法不正确。

  • 我正在使用Antrl4解析一种类似java的语言,在这种语言中,可以使用专有的查询语言在括号中编写表达式。假设在Java方法中,应该允许以下行: 但这会导致第一个括号字符上的令牌识别错误。 这种做法有什么问题吗?有人能指出我正在犯的错误吗?