预处理语句在某些应用场合中显得十分高效和灵活,比如在一些重复查询或批量数据录入中。但是认识一个事物的真面孔往往要经历一番过程,甚至是折磨。尤其对菜鸟们来说,搞清一个概念或排除一个故障,往往要好几个小时甚至好几天的时间,个中滋味自是五花八门啊。
闲话少说,言归正传。本次系统环境是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();
}
......