Perché MySQLi utilizza punti interrogativi (?) invece della formattazione sprintf?

3

Come dice il titolo, perché MySQLi usa i punti interrogativi invece della formattazione sprintf() ? Ad esempio, perché è

$stmt = $mysqli->prepare("SELECT * FROM table WHERE column1 = ?");
$stmt->bind_param('s', $var);

invece di

$stmt = $mysqli->prepare("SELECT * FROM table WHERE column1 = %s", $var);

Ci sono state alcune complicazioni con l'utilizzo della formattazione sprintf o c'erano rischi associati alla sicurezza? Inoltre, se fosse necessario avere un punto interrogativo nell'istruzione SQL, c'è un modo per evitarlo (in sprintf() , si farebbe solo %% invece di % )?

    
posta ub3rst4r 20.11.2013 - 00:44
fonte

1 risposta

6

Non esiste uno standard particolare per le query parametrizzate, quindi potrebbe anche essere una sintassi. Non sono sicuro di quale strato DB stavi usando in precedenza il %s preferito (ma se si tratta di Python MySQLdb il motivo è che sta utilizzando la propria funzione di parametrizzazione non nativa che utilizza effettivamente l'operatore di formato stringa per eliminare il parametri nella query).

Il mysqli_prepare di PHP è implementato usando la funzione di parametrizzazione nativa libmysql-nativa mysql_stmt_prepare e tale funzione ha deciso di utilizzare i punti interrogativi.

if you needed to have a question mark in your SQL statement, is there a way to escape it

Non è necessario evaderlo: oltre a rappresentare un parametro, l'unico punto in cui è possibile utilizzare un punto interrogativo in SQL si trova in una stringa letterale. ? non ha poteri speciali in una stringa letterale, quindi:

SELECT '?' FROM x WHERE x.id=?

seleziona un punto interrogativo letterale in cui l'ID corrisponde al parametro.

    
risposta data 20.11.2013 - 14:37
fonte

Leggi altre domande sui tag