Heim > Artikel > Backend-Entwicklung > Wie wird die PHP-PDO-Vorverarbeitung zwischengespeichert?
Hohe Effizienz.
SQL-Injection verhindern.
Lesen Sie die offizielle Dokumentation, php.net-Datenobjekte
Ob die Effizienz verbessert wird? Wenn die Vorverarbeitung das gleiche Vorverarbeitungs-SQL ist und nur die Parameter ändert, wird die Effizienz meiner Meinung nach definitiv verbessert: Wenn es jedoch die folgende Situation ist:
<code>//1. 在参数数量不一致的时候不能使用同一个预处理SQL。如下要使用两个预处理语句。 SELECT name FROM product WHERE product_id in (?, ?, ?, ?); SELECT name FROM product WHERE product_id in (?, ?, ?, ?, ?); //PS: 如果是参数数量比较多的话,不知道效率会不会比直接(12, 34, 45, 23...)慢,但直接用id列表不能预防SQL注入。 //2. 每次执行完预处理之后,再次执行相同的预处理,会不会速度更快。 $sql = 'SELECT name FROM product where product_id = ?'; $statement = PDO::prepare($preSql); $product_id = 111; $statement.bindParam(1, $product_id); $statement->execute(); /* 最理想的情况是除掉注释的,直接使用$statement调用两次。 但是,平常一些SQL操作并不是这么连贯(同类型的SQL可能分开执行),并不好分析。 不能缓存$statement, 然后调用同一个$statement. 如果第一次执行完成后,方法已经结束(资源释放),第二次执行又重新prepare相同的SQL。 这时候不知道会不会调用缓存的预处理SQL,如果是缓存在DB,应该可以调用。 但如果缓存在PHP的话,感觉应该又要重新处理了,这样感觉没有直接使用不预处理的SQL效率高。 */ //$sql = 'SELECT name FROM product where product_id = ?'; //$statement = PDO::prepare($preSql); $product_id = 123; //$statement.bindParam(1, $product_id); $statement->execute(); /* 同理在处理ORDER的时候,如果缓存能生效使用参数,是最好的. 这样的话,就可以不用重新预处理SQL。也可以防SQL注入。 */ </code>
Hohe Effizienz.
SQL-Injection verhindern.
Lesen Sie die offizielle Dokumentation, php.net-Datenobjekte
Ob die Effizienz verbessert wird? Wenn die Vorverarbeitung das gleiche Vorverarbeitungs-SQL ist und nur die Parameter ändert, wird die Effizienz meiner Meinung nach definitiv verbessert: Wenn es jedoch die folgende Situation ist:
<code>//1. 在参数数量不一致的时候不能使用同一个预处理SQL。如下要使用两个预处理语句。 SELECT name FROM product WHERE product_id in (?, ?, ?, ?); SELECT name FROM product WHERE product_id in (?, ?, ?, ?, ?); //PS: 如果是参数数量比较多的话,不知道效率会不会比直接(12, 34, 45, 23...)慢,但直接用id列表不能预防SQL注入。 //2. 每次执行完预处理之后,再次执行相同的预处理,会不会速度更快。 $sql = 'SELECT name FROM product where product_id = ?'; $statement = PDO::prepare($preSql); $product_id = 111; $statement.bindParam(1, $product_id); $statement->execute(); /* 最理想的情况是除掉注释的,直接使用$statement调用两次。 但是,平常一些SQL操作并不是这么连贯(同类型的SQL可能分开执行),并不好分析。 不能缓存$statement, 然后调用同一个$statement. 如果第一次执行完成后,方法已经结束(资源释放),第二次执行又重新prepare相同的SQL。 这时候不知道会不会调用缓存的预处理SQL,如果是缓存在DB,应该可以调用。 但如果缓存在PHP的话,感觉应该又要重新处理了,这样感觉没有直接使用不预处理的SQL效率高。 */ //$sql = 'SELECT name FROM product where product_id = ?'; //$statement = PDO::prepare($preSql); $product_id = 123; //$statement.bindParam(1, $product_id); $statement->execute(); /* 同理在处理ORDER的时候,如果缓存能生效使用参数,是最好的. 这样的话,就可以不用重新预处理SQL。也可以防SQL注入。 */ </code>
Die Hauptfunktionen vorbereiteter Anweisungen sind wie folgt:
1. Sicherer: PDO oder die zugrunde liegende Datenbankbibliothek kümmern sich besonders um Bind-Variablen, die keine Einschränkungen akzeptieren. Wenn Sie immer vorbereitete Anweisungen verwenden, ist dies nicht der Fall anfällig für SQL-Injection-Angriffe.
2. Manchmal können Abfragen schneller sein. Viele Datenbanken speichern vorbereitete Anweisungen in Abfrageplänen und verwenden symbolische Verweise auf vorbereitete Anweisungen, anstatt den gesamten Abfragetext erneut zu übertragen. Das Offensichtlichste ist, dass Sie ein vorbereitetes Anweisungsobjekt nur einmal deklarieren und das vorbereitete Anweisungsobjekt dann wiederverwenden müssen, wenn Sie auf verschiedene Variablen stoßen.
Von beiden ist Sicherheit offensichtlich wichtiger, weshalb vorbereitete Aussagen unverzichtbar sind. Wenn es effizient ist, kann es meiner Meinung nach sein, dass dasselbe Objekt in mehreren Vorverarbeitungsprozessen verwendet wird, was die Effizienz verbessert.
Originalbeitrag