【问题标题】:PHP Update Query using mysqli function使用 mysqli 函数的 PHP 更新查询
【发布时间】:2015-02-17 09:05:48
【问题描述】:

这里我只需要通过文件上传更新category,sd,fd,assignto,reviewed。因此,当用户单击更新按钮时,它将转到update.php 并更新必要的字段。但它没有执行并显示警告:

警告:mysqli_stmt::bind_param(): 变量数不匹配 准备好的语句中的参数个数

谁能告诉我怎么了?

updateview.php

<form action="update.php" method="post" enctype="multipart/form-data" novalidate>
<?php
include_once('dbconn.php');
$srn = $_GET['srn'];
  if($stmt = $mysqli->prepare("SELECT srn, client, type, fy, category, sd, fd, assignto, edoc, reviewed, upload FROM main WHERE srn=?")){
    $stmt->bind_param("s",$_GET["srn"]);
    $stmt->execute();
    $stmt->bind_result($srn,$client,$type,$fy,$category,$sd,$fd,$assignto,$edoc,$reviewed,$upload);
    $stmt->fetch();
    $stmt->close();
  }
  ?>
  <label> <span>SRN</span>
  <input name="srn" type="text" id="srn" size="15" readonly="readonly" maxlength="40" value="<?php echo $srn; ?>"/>
  </label>
  <label> <span>Client</span>    
  <select class="required" name="client" disabled="disabled"/>
  <?php
    if($stmt = $mysqli->prepare("SELECT cname FROM client")){
      $stmt->execute();
      $stmt->bind_result($cname);
      while($stmt->fetch()){
        ?>
<option value="<?php echo $cname; ?>" <?php if($cname==$client){ echo "selected"; } ?>> <?php echo $cname; ?> </option>
        <?php
      } /* END OF WHILE LOOP */
      $stmt->close();
    } /* END OF PREPARED STATEMENT OF CLIENT */
  ?>
  </select>
    <input type="hidden" name="client" value = "<?php echo $row['client']; ?>" />
  </label>
  <label> <span>Type</span>    
  <select class="required" name="type" disabled="disabled"/>
  <?php
    if($stmt = $mysqli->prepare("SELECT type FROM entity")){
      $stmt->execute();
      $stmt->bind_result($type);
      while($stmt->fetch()){
        ?>
          <option value="<?php echo $type; ?>" <?php if($type==$type){ echo "selected"; } ?>> <?php echo $type; ?> </option>
        <?php
      } /* END OF WHILE LOOP */
      $stmt->close();
    } /* END OF PREPARED STATEMENT */
  ?>
  </select>
    <input type="hidden" name="type" value = "<?php echo $row['type']; ?>" />
  </label>
  <label> <span>Financial Year</span>    
  <select class="required" name="fy" disabled="disabled"/>
  <?php
    if($stmt = $mysqli->prepare("SELECT year FROM fy")){
      $stmt->execute();
      $stmt->bind_result($year);
      while($stmt->fetch()){
        ?>
      <option value="<?php echo $year; ?>" <?php if($year==$fy){ echo "selected"; } ?>> <?php echo $year; ?> </option>
        <?php
      } /* END OF WHILE LOOP */
      $stmt->close();
    } /* END OF PREPARED STATEMENT OF */
  ?>
  </select>
    <input type="hidden" name="fy" value = "<?php echo $row['fy']; ?>" />
  </label>
  <label> <span>Category</span>      
  <select class="required" name="category"/>
  <?php
    if($stmt = $mysqli->prepare("SELECT name FROM category")){
      $stmt->execute();
      $stmt->bind_result($name);
      while($stmt->fetch()){
        ?>
          <option value="<?php echo $name; ?>" <?php if($name==$category){ echo "selected"; } ?>> <?php echo $name; ?> </option>
        <?php
      } /* END OF WHILE LOOP */
      $stmt->close();
    } /* END OF PREPARED STATEMENT OF CATEGORY */
  ?>
  </select>
  </label>
<label> <span>Short Description</span>
    <textarea required="required" name='sd'><?php echo $sd; ?></textarea>
</label>
<label> <span>Full Description</span>
    <textarea required="required" name='fd'><?php echo $fd; ?></textarea>
</label>
  <label> <span>Assign To</span>    
  <select class="required" name="assignto"/>
  <?php
    if($stmt = $mysqli->prepare("SELECT name FROM assignto")){
      $stmt->execute();
      $stmt->bind_result($name);
      while($stmt->fetch()){
        ?>
          <option value="<?php echo $name; ?>" <?php if($name==$name){ echo "selected"; } ?>> <?php echo $name; ?> </option>
<?php
}
      $stmt->close();
}
?>
  </select>
  </label>
  <label> <span>EDOC</span>
  <input name="edoc" type="text" id="edoc" size="15" readonly="readonly" maxlength="40" value="<?php echo $edoc; ?>"/>
  </label>
  <label> <span>Reviewed By</span>    
  <select class="required" name="reviewed"/>
  <?php
    if($stmt = $mysqli->prepare("SELECT type FROM entity")){
      $stmt->execute();
      $stmt->bind_result($type);
      while($stmt->fetch()){
?>
<option value="<?php echo $type; ?>" <?php if($type==$reviewed){ echo "selected"; } ?>> <?php echo $type; ?> </option>
<?php
}
      $stmt->close();
}
?>
  </select>
  </label>
        <label>
            <span>Input Attachment</span>
        <input type="file" name ="filename" required>
        </label>
<button id='cancel' type='cancel'>Cancel</button>
<button id='send' type='submit'>Update</button>
</form>

更新.php

<?php
    include('dbconn.php');
    $srn      = $_POST['srn'];
    $client   = $_POST['client'];
    $type     = $_POST['type'];
$fy       = $_POST['fy'];
    $category = $_POST['category'];
    $sd       = $_POST['sd'];
    $fd       = $_POST['fd'];
    $assignto = $_POST['assignto'];
    $edoc     = $_POST['edoc'];
    $reviewed = $_POST['reviewed'];

    $stmt = $mysqli->prepare("UPDATE main SET category=?,sd=?,fd=?,assignto=?,reviewed=?,upload=? WHERE srn=?");
    $stmt->bind_param('sssssb',$srn,$category, $sd,$fd,$assignto,$reviewed,$upload);
    $stmt->execute();
?>

dbconn.php

<?php
$host = "localhost";
$user = "root";
$pwd  = "root";
$db   = "eservice";
$mysqli = new mysqli($host,$user,$pwd,$db);
/* ESTABLISH CONNECTION */
if (mysqli_connect_errno()) {
   echo "Failed to connect to mysql : " . mysqli_connect_error();
    exit();
}
?>

【问题讨论】:

  • "变量数不匹配" . bind_param('sssssb',$category, $sd,$fd,$assignto,$reviewed,$upload); 有 7 个参数。但在查询 6 中。
  • 现在我又传递了一个参数,但仍然无法正常工作
  • 能否请您也添加 HTML 表单结构?
  • 最好添加在浏览器中呈现的 HTML 表单。我的意思是不要添加整个 php 和 html 代码,而是尝试通过从浏览器的源代码复制来添加呈现的 html,因为当前代码非常混乱。为此,您可以使用 Chrome 的 Inspect Element 或 firefox 的 Firebug。这可能会有所帮助:stackoverflow.com/questions/12576247/…

标签: php mysqli


【解决方案1】:
$stmt->bind_param('sssssb',$category, $sd,$fd,$assignto,$reviewed,$upload);

这里有 1 种类型的字符串和 6 个参数;

 $stmt = $mysqli->prepare("UPDATE main SET category=?,sd=?,fd=?,assignto=?,reviewed=?,upload=? WHERE srn=?");

你有 7 吗?这就是问题所在,应该是:

 $stmt->bind_param('sssssbd',$category, $sd,$fd,$assignto,$reviewed,$upload, $srn);

【讨论】:

  • @Kiran。我知道,你为 $srn 创建了一个参数占位符,但你没有将变量绑定到这个占位符,所以你绑定了 7 个占位符和 6 个参数,这就是它不起作用的原因
  • 怎么做告诉我,因为我是 php 新手。
  • @Kiran,我在上面写过,你应该再传递一个参数给 $stmt->bind_param()
  • 你能更新你的问题,然后放在那里 var_dump($_POST) 吗?而且,您是否为 $srn -> $stmt->bind_param 中的第一个字符串传递了正确的类型
【解决方案2】:

代码中的问题很少。尝试解决它们,看看问题是否解决。

  1. select 不是自结束标签。请更正。
  2. 你没有在update.php中初始化变量$uploads,它应该用$_POST['filename']初始化这似乎是实际的问题
  3. 选择元素是readonly,因此这些值不会包含在发布的表单中。尝试在它们旁边添加隐藏字段并使用这些隐藏字段来获取数据,而不是 update.php

【讨论】:

  • 是的,它不会接受该属性。你到底想用这些select 控件做什么?
  • 我正在为某些用户限制这些控件。
猜你喜欢
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 2023-03-16
  • 2020-08-09
相关资源
最近更新 更多