預先處理語句在某些應用場合中顯得十分高效和靈活,比如在一些重複查詢或批量資料錄入中。但是認識一個事物的真面孔往往要經曆一番過程,甚至是折磨。尤其對菜鳥們來說,搞清一個概念或排除一個故障,往往要好幾個小時甚至好幾天的時間,箇中滋味自是五花八門啊。
閑話少說,言歸正傳。本次系統內容是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();
}
......