|
當(dāng)有多條mysql語(yǔ)句連起來(lái)需要執(zhí)行,比如
$sqls= “insert table a values(1,2); insert table a values(2,3);”
需要執(zhí)行的話php中可以使用的方法有三個(gè):
mysql_query
pdo
mysqli
三種方法當(dāng)sqls語(yǔ)句沒(méi)有問(wèn)題的時(shí)候都是可以的。
但是
當(dāng)sql語(yǔ)句是錯(cuò)誤的時(shí)候會(huì)出現(xiàn)問(wèn)題
第一條sql錯(cuò)誤:三個(gè)方法都返回false
第一條sql正確,第二條sql錯(cuò)誤:mysql_query、pdo、 mysqli:query也是返回true。所以這個(gè)時(shí)候你是沒(méi)法判斷你的sqls是否有那條語(yǔ)句是錯(cuò)誤的。
解決這種辦法有幾個(gè)招:
1 解析sql語(yǔ)句
將每條sql都拆分開(kāi)來(lái)執(zhí)行。這樣每個(gè)語(yǔ)句分開(kāi)執(zhí)行就解決了。但是這種方法多出了好幾種方法,所以不可取。
2 將sqls語(yǔ)句保存為文本
使用cmd執(zhí)行命令 mysql…. .< sqls.sql, 然后捕獲輸出。這也是一種方法,但是感覺(jué)是繞著問(wèn)題走,應(yīng)該還有更好的方法。
3 使用mysqli::multi_query方法
這個(gè)方法可以執(zhí)行多條sql語(yǔ)句,然后使用mysqli::next_result來(lái)設(shè)置sql的偏移量,使用mysqli::error獲取當(dāng)前偏移的sql的錯(cuò)誤狀態(tài)
下面是第三種方法的示例代碼
代碼如下:
復(fù)制代碼 代碼如下:
$sql = Config::get('sql');
$content = file_get_contents($sql);
$config = Config::get('config')
$mysqli = mysqli_connect($config['host'], $config['user'], $config['password'], $config['dbname']);
$ret = $mysqli->multi_query($content);
if($ret === false) {
echo mysqli_error($mysqli);
}
while (mysqli_more_results($mysqli)) {
if (mysqli_next_result($mysqli) === false) {
echo mysqli_error($mysqli);
echo "/r/n";
break;
}
}
$mysqli->close();
這樣的話當(dāng)sqls語(yǔ)句中任意一條有錯(cuò)誤的話,程序就會(huì)跳出這個(gè)錯(cuò)誤。
如果你要編寫(xiě)初始化mysql的腳本的話,這招就非常好用了。
php技術(shù):PHP執(zhí)行批量mysql語(yǔ)句的解決方法,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。