請教相同的SQL查詢語句用prepare與query的開銷是一樣大的嗎?
$sql = $pdo -> prepare("select * from table");
$sql -> execute();
$rs = $sql -> fetch(PDO :: FETCH_ASSOC );
$sql = $pdo -> query("select * from table");
$rs = $go -> fetch(PDO :: FETCH_ASSOC);
例如上面prepare與query查詢是否效率一樣? (忽略SQL語句注入)。
單條查詢結(jié)果用哪一條比較好?
prepare在查詢時是否會傳送兩次資料庫至資料庫?
關(guān)於PDO的prepare是否只適合於select?其他的update、insert into這兩個操作呢? prepare用佔位符可以有效防注入,但當(dāng)? ="abc./- #$%`123"這些特殊符號(除非對其轉(zhuǎn)義)時,執(zhí)行語句卻報錯,
exec是否更適用於update、insert into?
1.PDO::query執(zhí)行一條SQL語句,如果通過,則傳回一個PDOStatement物件。 PDO::query函數(shù)有個“非常好處”,就是可以直接遍歷這個返回的記錄集。
2.PDO::exec執(zhí)行一條SQL語句,並傳回受影響的行數(shù)。此函數(shù)不會傳回結(jié)果集合。官方建議:
對於程式中只需要發(fā)出一次的 SELECT 語句,可以考慮使用 PDO::query()。
對於需要發(fā)出多次的語句,可用 PDO::prepare() 來準(zhǔn)備一個 PDOStatement 物件並用 PDOStatement::execute() 發(fā)出語句。
PDO::exec支援SELECT/DELETE/UPDATE/INSERT等全部SQL語句執(zhí)行,所以相較於PDO query()函數(shù)功能要強大的多。由於只會傳回受影響的函數(shù),所以,執(zhí)行SELECT無法得到PDOStatement對象,故也無法遍歷結(jié)果集,只能依照官方建議去使用query或execute函數(shù)。 。
3.prepare的原理是這樣的,預(yù)先把sql語句送到sql server進行編譯,等exec的時候再真正的執(zhí)行。一次編譯,多次執(zhí)行。如果只是一次查詢的話,prepare和query效率基本上相當(dāng)。如果多次執(zhí)行,prepare的效率就會提現(xiàn)出來。另外並不是所有sql注入都可以防止,where in(「 」)這樣的就不行。