【问题标题】:Warning: mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statement error警告:mysqli_stmt::bind_result():绑定变量的数量与准备好的语句错误中的字段数量不匹配
【发布时间】:2013-03-28 22:16:19
【问题描述】:

我有一个 mysql 查询,我正在将其转换为 mysqli(准备好的语句),但我遇到了一个引发以下错误的问题,

警告:mysqli_stmt::bind_result():绑定变量的数量与准备好的语句中的字段数量不匹配

Mysql代码

$random_name_generated = vpb_generate_random_name().'.jpg'; //Generated name for uploaded files or images

if (move_uploaded_file($_FILES['file_to_upload']['tmp_name'], $final_uploads_location)) {
    $check_empty_field = mysql_query("select * from `vpb_uploads` where `username` = '".mysql_real_escape_string(strip_tags($username))."'  and `firstname` = '".mysql_real_escape_string("")."' and `lastname` = '".mysql_real_escape_string("")."'");
    if (mysql_num_rows($check_empty_field) < 1) {
        mysql_query("insert into `vpb_uploads` values('', '".mysql_real_escape_string($username)."', '', '', '".mysql_real_escape_string($random_name_generated)."', '', '', '', '', '".mysql_real_escape_string(date("d-m-Y"))."')");

        $identity = "image_one";
    } else {
        $get_empty_field = mysql_fetch_array($check_empty_field);
        $image_one = strip_tags($get_empty_field["image_one"]);
        $image_two = strip_tags($get_empty_field["image_two"]);
        $image_three = strip_tags($get_empty_field["image_three"]);
        $image_four = strip_tags($get_empty_field["image_four"]);
        $image_five = strip_tags($get_empty_field["image_five"]);
        global $identity;

以下是我尝试过的,即使它不起作用。我已经知道它不会起作用,但我想在问问题之前自己尝试一下。错误来自$get_empty_field = $stmt-&gt;bind_result($stmt);

if (move_uploaded_file($_FILES['file_to_upload']['tmp_name'], $final_uploads_location)) {
    $firstname = '""';
    $lastname = '""';
    $stmt = $mysqli->prepare("select * from `vpb_uploads` where `username` = ?  and `firstname` = ? and `lastname` = ?");
    $stmt->bind_param('sss', $username, $firstname, $lastname);
    $stmt->execute();
    $stmt->store_result();
    if ($stmt->num_rows < 1) {
        $date = 'date("d-m-Y")';
        $image_2 = "''";
        $image_3 = "''";
        $image_4 = "''";
        $image_5 = "''";
        $stmt = $mysqli->prepare("insert into `vpb_uploads` (`username`, `firstname`, `lastname`, `image_one`, `image_two`, `image_three`, `image_four`, `image_five`, `date`) values(?,?,?,?,?,?,?,?,?)");
        $stmt->bind_param('sssssssss', $username, $firstname, $lastname, $random_name_generated, $image_2, $image_3, $image_4, $image_5, $date);
        $stmt->execute();
        $stmt->close();

        $identity = "image_one";
    } else {
        $get_empty_field = $stmt->bind_result($stmt);
        $image_one = strip_tags($get_empty_field["image_one"]);
        $image_two = strip_tags($get_empty_field["image_two"]);
        $image_three = strip_tags($get_empty_field["image_three"]);
        $image_four = strip_tags($get_empty_field["image_four"]);
        $image_five = strip_tags($get_empty_field["image_five"]);
        global $identity;

【问题讨论】:

    标签: php mysqli


    【解决方案1】:

    你需要改变

    $get_empty_field = $stmt->bind_result($stmt);
    

    $get_empty_field = $stmt->bind_result($field1, $field2, $field3);
    

    $fieldx 变量的数量等于所选字段的数量。如果你不知道有多少,使用这个:

      // Throw an exception if the result metadata cannot be retrieved
      if (!$meta = $stmt->result_metadata())
      {
        throw new Exception($stmt->error);
      }
    
      // The data array
      $data = array();
    
      // The references array
      $refs = array();
    
      // Iterate over the fields and set a reference
      while ($name = $meta->fetch_field())
      {
        $refs[] =& $data[$name->name];
      }
    
      // Free the metadata result
      $meta->free_result();
    
      // Throw an exception if the result cannot be bound
      if (!call_user_func_array(array($stmt, 'bind_result'), $refs))
      {
        throw new Exception($stmt->error);
      }
    

    然后您在获取后使用$data['field'] 访问结果;

    【讨论】:

    • 我改成了你说的,但它仍然抛出警告。
    • 表中有多少个字段?您向bind_result 函数传递了多少变量?
    • 表中有9个字段,我传递了3个变量。
    • 我确实进行了编辑以修复示例中的错误,因此您可能想再次复制我的代码。此外,如果有 10 个字段,则需要传递 10 个变量(使用 SELECT * 时)。
    • 哦,我不知道如何修复它,你能告诉我如何让它显示错误吗?我的意思是类似 mysqli->error();如果是 mysqli 错误。
    猜你喜欢
    • 2014-01-06
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多