运行准备好的语句 (MySQL/PHP)

Posted

技术标签:

【中文标题】运行准备好的语句 (MySQL/PHP)【英文标题】:Running a prepared statement (MySQL/PHP) 【发布时间】:2013-07-27 09:35:24 【问题描述】:

这是我第一次使用准备好的语句,我遇到了问题。当我运行以下代码时,我收到一条错误消息:

警告:mysqli_stmt_bind_param() [function.mysqli-stmt-bind-param]:类型定义字符串中的元素数与第 49 行 ... 中的绑定变量数不匹配

第 49 行是下面的 mysqli_stmt_bind_param 语句。似乎字符串的数量(“ssssss”)与该语句中正确的字符串数量相匹配,所以我有点不知所措。

<?php

$var1 = $_POST['var1'];
$var2 = $_POST['var2'];
$var3 = $_POST['var3'];
$var4 = $_POST['var4'];
$var5 = $_POST['var5'];
$var6 = $_POST['var6'];

      if (!empty($var1)&&!empty($var2)&&!empty($var3)
      &&isset($var4, $var5, $var6));

      require_once 'connect.inc.php';

      $query = "INSERT INTO tablename (var1, var2, var3, var4, var5, var6)
      VALUES ('$var1','$var2','$var3','$var4','$var5', '$var6')";

      $stmt = mysqli_prepare($link, $query);

      mysqli_stmt_bind_param($stmt, "ssssss", $var1, $var2, $var3, $var4, $var5, 
      $var6);

      mysqli_stmt_execute($stmt);

      if (mysqli_stmt_affected_rows($stmt)==1);

      mysqli_stmt_close($stmt);

      $result = mysqli_query($link, $query);

      if ($result) 
        echo 'Thank you for your submission.';
            
      else 
          echo 'We were unable to process your information.'.mysqli_error($link).'
          Please ensure all required fields were filled out.;
          

      mysqli_close($link);
?>

非常感谢任何帮助!谢谢!顺便说一句,我确实收到了“谢谢您的提交”。消息。

【问题讨论】:

【参考方案1】:

问题出在格式不匹配,是你没有要绑定的参数。参数应使用? 作为查询中的占位符;

$query = "INSERT INTO tablename (var1, var2, var3, var4, var5, var6)
          VALUES ('$var1','$var2','$var3','$var4','$var5', '$var6')";

应该是

$query = "INSERT INTO tablename (var1, var2, var3, var4, var5, var6)
      VALUES (?, ?, ?, ?, ?, ?)";   // <-- six place holders for the parameters

【讨论】:

【参考方案2】:

将您的查询更改为:

$query = "INSERT INTO tablename (var1, var2, var3, var4, var5, var6)
      VALUES (?,?,?,?,?, ?)";

告诉你为绑定设置了参数。

【讨论】:

以上是关于运行准备好的语句 (MySQL/PHP)的主要内容,如果未能解决你的问题,请参考以下文章

准备好的语句不使用预期的索引

Cassandra CQL 准备好的语句比非准备好的语句慢?

Golang使用准备好的SQL语句

MySQLi:使用一个准备好的语句插入多行

MYSQL - 准备好的语句 NULL 处理

Java 不运行带参数的准备好的语句并且不抛出任何错误