Na een update naar WordPress 3.6, zag ik de volgende PHP foutmelding op mijn website:
Missing argument 2 for wpdb::prepare()
Eerst gaf ik WordPress 3.6 de schuld, maar na wat zoeken bleek het dat ik zelf $wpdb->prepare niet correct gebruikte (zie ook dit artikel en deze post op de WP forums).
Quick fix:
Een aantal ontwikkelaars gebruikt $wpdb->prepare() zonder extra parameters;
$wpdb->get_row($wpdb->prepare( "SELECT COUNT(*) FROM table" ));
Het blijkt dus (na GOED lezen) dat de prepare() functie hier niets bijdraagt. Er is niets wat de functie moet schoonmaken. Normaal gesproken gebruik je de prepare() functies om waarden die je aan de query doorgeeft "safe" te maken (m.b.v. %d, %s, %f) zodat er geen foute zaken gebeuren als mensen proberen zogenaamde SQL-Injects te plaatsen.
De bovenstaande SQL query zou er eigenlijk zo uit moeten zien:
$wpdb->get_row( "SELECT COUNT(*) FROM table" );
Voor queries waar we waarden van de eindgebruiker doorgeven aan de query maakt ik zelf de volgende fout:
$wpdb->prepare( "SELECT * FROM table WHERE id = ".$id." AND active=1" );
Effectief deed dit helemaal NIKS. De functie moet daarom aangepast worden naar:
$wpdb->prepare( "SELECT * FROM table WHERE id = %d AND active=1", $id );
Dit zorgt ervoor dat queries veiliger zijn en dat de foutmelding niet meer verschijnt.