PHP准备语句插入查询

时间:2018-02-09 18:09:06

标签: php mysql

以下代码中存在错误。

demo.php:

<form method="post" action="">
  <table border="1">
    <tr>
      <td> Enter Name </td>
      <td> <input type="text" name="txtname"/> </td>
    </tr>
    <tr>
      <td> Enter Email </td>
      <td> <input type="text" name="txtemail" /> </td>
    </tr>
    <tr>
      <td colspan="2" align="center">
      <input type="submit" name="btnsubmit" value="Add" />
      </td>
    </tr>
    <tr>
      <td colspan="2" align="center">
      <?php
      if(isset($_REQUEST['message']))
      {
      echo $_REQUEST['message'];
      }
      ?>
      </td>
    </tr>
  </table>
</form>

<?php
include 'db_operations.php';
  if(isset($_POST['btnsubmit']) and isset($_POST['btnsubmit']) == "Add")
  {
    extract($_POST);
    $insertQuery = "INSERT INTO author(name,email) VALUES (?,?)";
    $param_type = "ss";
    $param = $txtname.','.$txtemail;
    $result = $db->executeQuery('insert',$insertQuery,$param_type,$param);
    header("Location:demo.php?message=$result");  
  }
?>

db_operations.php:

<?php
  function executeQuery($query_type,$query_string,$param_type,$param)
  {
      $result = "Error";

      set_error_handler("logError");

      if(!$stmt = $this->con->prepare($query_string))
      {
          trigger_error("Failed to prepare statement for " . $query_type ." query");
      }

      if(!$stmt->bind_param($param_type,$param))
      {
          trigger_error("Failed to bind parameter for " . $query_type ." query");
      }
      if(!$stmt->execute())
      {
          trigger_error("Failed to execute " . $query_type ." query");
      }
      else
      {
          $result = "Record ".$query_type."ed successfully";
      }

      $this->stmt->close();
      $this->con->close();
      return $result;
  }
?>

有2个php文件。第一个脚本接受记录并进行插入查询,第二个脚本执行该查询。

但是,当我执行程序时,它会显示以下错误:

  

*错误类型:E_WARNING   *错误字符串:mysqli_stmt :: bind_param():类型定义字符串中的元素数量与匹配变量数量不匹配   *错误行:55   *错误文件:F:\ wamp \ www \ food_app \ inc \ admin_db_operations.php   *错误日期:09-02-2018 06:43:09 pm

     

*错误类型:E_USER_NOTICE   *错误字符串:无法绑定插入查询的参数   *错误行:57   *错误文件:F:\ wamp \ www \ food_app \ inc \ admin_db_operations.php   *错误日期:09-02-2018 06:43:09 pm

     

*错误类型:E_USER_NOTICE   *错误字符串:无法执行插入查询   *错误行:61   *错误文件:F:\ wamp \ www \ food_app \ inc \ admin_db_operations.php   *错误日期:09-02-2018 06:43:09 pm

请指导我如何改进我的功能才能正常工作。

3 个答案:

答案 0 :(得分:1)

好吧,根据错误消息:

  

类型定义字符串中的元素数量与绑定变量数量

不匹配

您指定的变量数量与您提供的数量不同。让我们来看看绑定值的位置:

$stmt->bind_param($param_type,$param)

您正在传递字符串"ss",表示有两个要绑定的参数。但是,您只在$param中传递了一个值。该值是由您想要的两个不同值组成的单个字符串。

您必须单独绑定值,而不是单个字符串。

bind_param()函数需要可变数量的参数。所以你应该能够在你的函数中传递相同的概念。它已经有一段时间了,但我认为它可能看起来像这样:

function executeQuery($query_type, $query_string, $param_type, ...$params)

...会告诉PHP $paramsvariable-length argument list。然后我想你可以将该列表传递给bind_param()

$stmt->bind_param($param_type, $params)

当你调用你的函数时,不是将你的值连接成一个字符串,而是将它们作为单独的值传递:

$db->executeQuery('insert', $insertQuery, $param_type, $txtname, $txtemail)

答案 1 :(得分:1)

在这部分代码中:

$insertQuery = "INSERT INTO author(name,email) VALUES (?,?)";
$param_type = "ss";
$param = $txtname.','.$txtemail;

这一行错了:

$param = $txtname.','.$txtemail;

为什么呢?因为你只是在1中转换2个变量。然后当你尝试绑定参数时,你会得到你的描述中提到的错误,因为查询期望2个参数不是1.如果你的想法是通过这个参数“all-in-one “你可以创建一个数组:

//$param = $txtname.','.$txtemail; // this line is wrong
$param = array($txtname, $txtemail); // This line is correct!

然后,您更改代码中“绑定”值的方式,更改此代码:

if(!$stmt->bind_param($param_type,$param))
      {
          trigger_error("Failed to bind parameter for " . $query_type ." query");
      }

这个:

if(!$stmt->bind_param($param_type,$param['0'],$param['1']))
      {
          trigger_error("Failed to bind parameter for " . $query_type ." query");
      }

此处有关绑定参数的更多信息:mysqli stmt bind以及您可以在此处使用数组的方式:PHP Arrays

答案 2 :(得分:-1)

首先,您的PHP代码都不会运行,因为您的条件包括:

isset($_POST['btnsubmit']) == "Add"

虽然你肯定意味着

$_POST['btnsubmit'] == "Add"

因为isset()的结果可能是truefalse,但肯定不是"Add"

第二个你的$param变量应该是这样的数组:

$param = [$txtname, $txtemail];

因为现在,您只传递了一个参数,该参数由一个中间有逗号但仍然只有一个字符串的字符串组成,这样就可以填充查询中的第一个?MySQL正在等待第二个参数。这是WARNING所说的