[英]PHP PDO MySQL No Exception or Error
我有以下使用PDO的腳本。
$db = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$sql = "BEGIN;\n".
"INSERT INTO exp_ws_gk_text (WGT_PRG_CODE, WGT_TEXT)\n".
" VALUES('".$_POST['prg_code']."', ".$db->quote($_POST['text']).");\n" .
"SELECT @Lid:=LAST_INSERT_ID();\n" .
"INSERT INTO exp_ws_gk_state (WGS_STATE, WGS_TYPE, WGS_WGT_RID)\n".
" VALUES('".$_POST['state']."', ".$_POST['type'].", @Lid);\n".
"SELECT a.wgt_prg_code prg_code, b.wgs_state state, b.wgs_type type, a.wgt_rid id, a.wgt_text text\n".
" FROM exp_ws_gk_text a\n".
" JOIN exp_ws_gk_state b ON b.wgs_wgt_rid = a.wgt_rid\n".
" WHERE b.wgs_wgt_rid = @Lid ORDER BY a.wgt_prg_code;\n".
"COMMIT;\n";
$fp = fopen("/var/tmp/save_gatekeeper.txt", "a");
fwrite($fp, "SQL:". $sql."\n");
try {
$res = $db->prepare($sql);
$res->execute();
$error = $db->errorInfo();
fwrite($fp, "ErrorInfo:".print_r($error, true)."\n\n");
fwrite($fp, "Row: ".print_r($res->fetch(PDO::FETCH_ASSOC), true)."\n\n");
fwrite($fp, "Row2: ".print_r($res->fetch(PDO::FETCH_LAZY),true)."\n\n");
}
catch (PDOException $e) {
fwrite($fp, "ExceptionInfo:".print_r($e, true)."\n\n");
}
fclose($fp);
echo json_encode($res->fetch(PDO::FETCH_ASSOC););
這是產生的日志:
SQL:BEGIN;
INSERT INTO exp_ws_gk_text (WGT_PRG_CODE, WGT_TEXT)
VALUES('EDS', '[h3]IMPORTANT INFORMATION[/h3][p]This is a test gatekeeper for [b]Eddie\'s[/b] Classroom Course[/p]');
SELECT @Lid:=LAST_INSERT_ID();
INSERT INTO exp_ws_gk_state (WGS_STATE, WGS_TYPE, WGS_WGT_RID)
VALUES('AL', 1, @Lid);
SELECT a.wgt_prg_code prg_code, b.wgs_state state, b.wgs_type type, a.wgt_rid id, a.wgt_text text
FROM exp_ws_gk_text a
JOIN exp_ws_gk_state b ON b.wgs_wgt_rid = a.wgt_rid
WHERE b.wgs_wgt_rid = @Lid ORDER BY a.wgt_prg_code;
COMMIT;
ErrorInfo:Array
(
[0] => 00000
)
Row:
Row2:
我不確定為什么它沒有報告任何類型的錯誤或異常。 這是我第一次使用PDO。 我從使用較舊的mysql調用轉換而來。
有人可以幫忙嗎?
我希望最后一次選擇的結果能被發回,我得到的只是“假”。
由於您要使用帶有多個查詢的預備語句,因此需要使用模擬的預備語句。 請參閱PDO對多個查詢的支持(PDO_MYSQL,PDO_MYSQLND)
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
否則,我相信您正在執行的唯一操作就是BEGIN;
我個人認為,將多個查詢放入一個PDO語句中是一種不好的做法。 您應該考慮將事務與PDO和多個語句一起使用,這使您可以更輕松地確定哪個查詢引起了問題並在發生錯誤時回滾。
其次,您正在使用准備好的語句,但仍無法保護自己免受SQL注入的侵害。 不要在prepare()中使用$ _POST。 准備語句后,應將其綁定。
干杯,我們在聊天中解決了這個問題。
您正在混合多種類型的語句。 您需要將查詢分為兩個單獨的查詢; 一個使用INSERT
和$res->query
,然后驗證響應,然后另一個使用SELECT
使用$res->fetch()
或$res->fetchAll()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.