web-dev-qa-db-fra.com

$ Wpdb-> prepare ne crée-t-il pas une instruction préparée que je puisse exécuter plusieurs fois?

Je me demande de la syntaxe

$sql = $wpdb->prepare( 'query' [, value_parameter, value_parameter ... ] )

Il semble (d'après la syntaxe - les valeurs au sein de prepare) qu'il échappe simplement aux valeurs et ne crée pas une instruction préparée qui me donne des avantages en termes de performances lorsque je l'exécute plusieurs fois, différents paramètres?

Au 2e regard, puisque les valeurs sont facultatives, je peux les définir après la préparation? Comment je fais ça?

5
JM at Work

$wpdb-prepare fonctionne comme sprintf et vsprintf. Le premier argument sera toujours une chaîne de format.

%s et %d sont les seuls spécificateurs de format acceptables. D'autres n'ont jamais été testés mais peuvent entraîner une erreur d'analyse conformément au Codex. Vous devez échapper littéralement% dans votre requête avec% , par exemple: %%

Si vous l'utilisez comme sprintf, ce qui n'est possible que si vous connaissez le nombre d'arguments avant l'exécution, vous pouvez alors faire correspondre le nombre d'arguments au nombre de spécificateurs de format de votre chaîne de formatage.

E.g: $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}_votes WHERE post_id = %d AND username = %s", $post_id, $username );

Si vous ne connaissez pas le nombre d'arguments jusqu'à l'exécution, vous devez l'utiliser comme vsprintf. Dans ce cas, le premier argument sera un spécificateur de format, mais le second argument sera un tableau.

E.g: $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}_votes WHERE post_id = %d AND username = %s", array( $post_id, $username ) );

$wpdb->prepare renverra une chaîne SQL QUERY que vous pourrez exécuter autant de fois que vous le souhaitez.

Pour les exemples ci-dessus, la requête obtenue sera: SELECT * FROM wp_votes WHERE post_id = 747 AND username = 'cooluser'

4
Hameedullah Khan

Je pense qu'il va sans dire que les développeurs s'attendent à ce qu'une déclaration "préparé" signifie qu'il soit "préparé" dans la base de données !

Il a été demandé dans une sous-question si la déclaration pouvait être utilisée encore et encore. Wpdb-> prepare ne "prépare" pas réellement la déclaration. Il ne désinfecte que les intrants. Vous pouvez le voir dans: wordpress/wp-includes/wp-db.php. Recherchez la fonction prepare et voyez qu'elle crée simplement une requête normale non préparée:

$query = array_shift($args);
$query = str_replace("'%s'", '%s', $query);
$query = str_replace('"%s"', '%s', $query);
$query = str_replace('%s', "'%s'", $query); // quote the strings
array_walk($args, array(&$this, 'escape_by_ref'));
return @vsprintf($query, $args); 

Fondamentalement, la fonction wpdb-> prepare devrait s'appeler "assainir" ou "nettoyer" ou quelque chose du genre. L'appeler "preparer" est trompeur pour quiconque connaît SQL.

5
user49582