预处理语句在某些应用场合中显得十分高效和灵活,比如在一些重复查询或批量数据录入中。但是认识一个事物的真面孔往往要经历一番过程,甚至是折磨。尤其对菜鸟们来说,搞清一个概念或排除一个故障,往往要好几个小时甚至好几天的时间,个中滋味自是五花八门啊。

     闲话少说,言归正传。本次系统环境是xp,mysql版本5.1,php 5.3,apache 2.2。在这本教材的本例中,不幸的是教材示例竟然是错误的,所以遇到故障只能搜啊搜,历经数时终于受到启发将这个拦路虎给扫平了,原来我的问题是用户权限不足所致!

   以下是总结的几个可能遇到的常见故障现象:

   错误1:Fatal error: Call to a member function bind_param() on a non-object in...
           sql语句错误导致,如:$query = "INSERT INTO products VALUES(?,?,?)";
           应该是:$query = "INSERT INTO products(sku,name,price) VALUES(?,?,?)";
      错误2:INSERT command denied to user 'sn2010'@'localhost' for table 'products'
          用户没有INSERT 权限导致该错误,通过grant增加相应权限后,该故障消除。

   ( 其他几个故障现象没留意保存记录,现在忘了呵呵)
    为了有效避免以上错误,应增加以下判断:

    if( $stmt = $mysqli->prepare($query) ) {
             ...
             }else{ echo $mysqli_error;exit();}

下面是完整的测试代码,无误:

......

if(isset($_POST["submit"]))
  {
  $mysqli = new mysqli('localhost','s2012','s2012','fws');
  if ( mysqli_connect_errno()) {
   printf ( "Connect failed: %s\n" , mysqli_connect_error ());
   exit();
   }
  $query = "INSERT INTO products(sku,name,price)VALUES(?,?,?)";
  $stmt=$mysqli->prepare($query);
  if( $stmt = $mysqli->prepare($query) ) {

   $stmt->bind_param('ssd',$ss,$nn,$pp);
   $skuarray = $_POST['sku'];
   $namearray = $_POST['name'];
   $pricearray = $_POST['price'];
   $x = 0;
   while($x < sizeof($skuarray))
   {
    $ss = $skuarray[$x];
    $nn = $namearray[$x];
    $pp = $pricearray[$x];   
    $stmt->execute();
    //$stmt->reset();
    $x++;
   }  
   }else {
        echo $mysqli->error;
        exit();
   }
   $stmt->close();
   $mysqli->close();
  }

......