3 回答

TA貢獻1770條經驗 獲得超3個贊
的MySQL>=5.1.17(或>=5.1.21) PREPARE
和 EXECUTE
發言) 可以在查詢緩存中使用準備好的語句。 ..因此,您的MySQL+PHP版本可以在查詢緩存中使用準備好的語句。但是,請仔細注意MySQL文檔中緩存查詢結果的注意事項。有許多類型的查詢不能被緩存,或者即使它們被緩存,也是無用的。根據我的經驗,查詢緩存通常不是一個很大的勝利。查詢和架構需要特殊的構造才能最大限度地利用緩存。通常,從長遠來看,應用程序級緩存最終是必要的。 本機準備對安全性沒有任何影響。偽準備語句仍將轉義查詢參數值,它將在PDO庫中使用字符串完成,而不是在MySQL服務器上使用二進制協議完成。換句話說,相同的PDO代碼將同樣容易受到注入攻擊(或不受攻擊),而不管您的攻擊是什么。 EMULATE_PREPARES
背景。唯一的區別是參數替換發生在什么地方 EMULATE_PREPARES
,它發生在PDO庫中; EMULATE_PREPARES
,它發生在MySQL服務器上。 無 EMULATE_PREPARES
您可能在準備時而不是在執行時出現語法錯誤; EMULATE_PREPARES
只有在執行時才會收到語法錯誤,因為PDO直到執行時才會向MySQL提供查詢。請注意 這會影響您將要編寫的代碼。!尤其是如果你用 PDO::ERRMODE_EXCEPTION
!
有固定的成本 prepare()
(使用本機準備的語句),因此 prepare();execute()
對于本機準備的語句,可能比使用模擬準備語句發出普通文本查詢要慢一些。在許多數據庫系統中, prepare()
也是緩存的,并且可以與多個連接共享,但我認為MySQL不會這樣做。因此,如果不將準備好的語句對象用于多個查詢,則總體執行速度可能會更慢。
作為最后建議
/** * Return PDO handle for a MySQL connection using supplied settings * * Tries to do the right thing with different php and mysql versions. * * @param array $settings with keys: host, port, unix_socket, dbname, charset, user, pass. Some may be omitted or NULL. * @return PDO * @author Francis Avila */function connect_PDO($settings){ $emulate_prepares_below_version = '5.1.17'; $dsndefaults = array_fill_keys(array('host', 'port', 'unix_socket', 'dbname', 'charset'), null); $dsnarr = array_intersect_key($settings, $dsndefaults); $dsnarr += $dsndefaults; // connection options I like $options = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ); // connection charset handling for old php versions if ($dsnarr['charset'] and version_compare(PHP_VERSION, '5.3.6', '<')) { $options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES '.$dsnarr['charset']; } $dsnpairs = array(); foreach ($dsnarr as $k => $v) { if ($v===null) continue; $dsnpairs[] = "{$k}={$v}"; } $dsn = 'mysql:'.implode(';', $dsnpairs); $dbh = new PDO($dsn, $settings['user'], $settings['pass'], $options); // Set prepared statement emulation depending on server version $serverversion = $dbh->getAttribute(PDO::ATTR_SERVER_VERSION); $emulate_prepares = (version_compare($serverversion, $emulate_prepares_below_version, '<')); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, $emulate_prepares); return $dbh;}
添加回答
舉報