搜尋

首頁  >  問答  >  主體

php - prepare與sql的開銷?

請教相同的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語句注入)。
單條查詢結果用哪一條比較好?
prepare在查詢時是否會傳送兩次資料庫至資料庫?

關於PDO的prepare是否只適合於select?其他的update、insert into這兩個操作呢? prepare用佔位符可以有效防注入,但當? ="abc./- #$%`123"這些特殊符號(除非對其轉義)時,執行語句卻報錯,
exec是否更適用於update、insert into?

我想大声告诉你我想大声告诉你2733 天前780

全部回覆(1)我來回復

  • 阿神

    阿神2017-06-05 11:09:31

    1.PDO::query執行一條SQL語句,如果通過,則傳回一個PDOStatement物件。 PDO::query函數有個“非常好處”,就是可以直接遍歷這個返回的記錄集。
    2.PDO::exec執行一條SQL語句,並傳回受影響的行數。此函數不會傳回結果集合。官方建議:
    對於程式中只需要發出一次的 SELECT 語句,可以考慮使用 PDO::query()。
    對於需要發出多次的語句,可用 PDO::prepare() 來準備一個 PDOStatement 物件並用 PDOStatement::execute() 發出語句。
    PDO::exec支援SELECT/DELETE/UPDATE/INSERT等全部SQL語句執行,所以相較於PDO query()函數功能要強大的多。由於只會傳回受影響的函數,所以,執行SELECT無法得到PDOStatement對象,故也無法遍歷結果集,只能依照官方建議去使用query或execute函數。 。
    3.prepare的原理是這樣的,預先把sql語句送到sql server進行編譯,等exec的時候再真正的執行。一次編譯,多次執行。如果只是一次查詢的話,prepare和query效率基本上相當。如果多次執行,prepare的效率就會提現出來。另外並不是所有sql注入都可以防止,where in(「 」)這樣的就不行。

    回覆
    0
  • 取消回覆