這實際上是my earlier question today的派生項。在foreach循環中調用存儲過程 - 僅首次執行
我在我的數據庫中創建了一個存儲過程,我想從PHP中連續調用多次。
比方說,這是我的方法:
CREATE PROCEDURE PROC_1(
IN param1 VARCHAR(255),
IN param2 VARCHAR(255))
BEGIN
DECLARE ok INT;
DECLARE success, failure VARCHAR(255);
/* several SELECT, IF ... THEN, INSERT and UPDATE operations which then SET ok var to 0 or 1 */
IF ok = 1 THEN
SET success = 'Everything went well';
SELECT success;
LEAVE;
ELSE
SET failure = 'Problem description';
SELECT failure;
LEAVE;
END IF;
END
我就是這麼做的(短版):
$calls = array(
"CALL PROC_1('param1', 'param2')",
"CALL PROC_1('param3', 'param4')",
"CALL PROC_1('param5', 'param6')",
);
// assuming I'm already connected to DB with $link
foreach ($calls as $i => $call)
{
echo $i . ': ';
$result = mysql_query($call);
$ok = ($result === FALSE) ? FALSE : TRUE;
var_dump($ok);
if ($result !== FALSE)
mysql_free_result($result);
}
第一次迭代按預期工作,但回報FALSE
後什麼。
這是爲什麼?
試圖mysqli
以防萬一,但恰好有相同的輸出:
0: bool(true)
1: bool(false)
2: bool(false)
有趣的,我檢查MySQL的日誌(日誌記錄設置爲記錄所有查詢)和只有第一個查詢還未獲得服務器。接下來的查詢永遠不會到達服務器。
PS。我運行PHP 5.3.2和Apache 2.2.17。
UPDATE
按沙克蒂·辛格的建議,我查詢數據庫之前檢查$link
狀態。我注意到有一個錯誤,因爲第二次迭代所以這裏有錯誤的輸出:
ERROR: (0)
0: bool(true)
ERROR: (0)
ERROR: (0)
1: bool(false)
ERROR: (2014) Commands out of sync; you can't run this command now
ERROR: (2014) Commands out of sync; you can't run this command now
2: bool(false)
ERROR: (2014) Commands out of sync; you can't run this command now
而且,這似乎在MySQL錯誤日誌:
101126 15:46:28 [Warning] Aborted connection 129 to db: 'db1' user: 'root' host: 'localhost' (Got an error reading communication packets)
你可以var_dump($ link)在echo $ i之下。 ':'; – 2010-11-26 14:07:10