2009-04-21 12 views
12

Sto spostando un vecchio codice nella nuova interfaccia msqli utilizzando le istruzioni preparate, ho problemi con le istruzioni SQL che contengono la clausola IN. Vorrei solo normalmente fare questo:Come si usano le clausole IN con le istruzioni preparate su mysqli

$ids = '123,535,345,567,878' 
$sql = "SELECT * FROM table WHERE id IN ($ids)"; 
$res = mysql_query($sql); 

Conversione ciò MySQLi e istruzioni preparate ho provato una serie di soluzioni:

$ids = '123,535,345,567,878' 
$ids = implode($ids,','); 
$result = $msqli->prepare("SELECT foo,blar FROM table WHERE id IN (?)); 
$result->bind_param("i", $ids); 
$result->execute(); 

che questo non riesce e calcolando il numero di elementi nella matrice e l'alterazione anche il numero di punti interrogativi nella stringa SQL e il bind_parm di chiamata per ogni elemento nell'array falliscono. Anche solo l'uso della stringa separata da virgola non riesce.

Non riesco a trovare alcuna buona documentazione su Google, quindi come hai risolto il problema?

+0

Eventuali duplicati di [? PreparedStatement IN alternative clausola] (https://stackoverflow.com/questions/178479/preparedstatement -in-clausole-alternative) – bfavaretto

risposta

9

Non è possibile associare un elenco di lunghezza variabile a una singola variabile associata.

Allo stesso modo, se si dovesse legare la stringa $ids ci troveremo a finire con:

SELECT foo,blar FROM table WHERE id IN ('123,535,345,567,878') 

(Notare le virgolette l'elenco di ID).

La creazione della propria query con il numero corretto di punti interrogativi e parametri associati avrebbe dovuto funzionare correttamente: potrebbe essere necessario riprovare e segnalare l'errore effettivo.

In alternativa, questa potrebbe essere una di quelle occasioni in cui purtroppo è necessario creare manualmente il proprio SQL e non utilizzare i parametri associati.

-1

ho pensato che il punto di istruzioni preparate è stato così in questa situazione si può solo fare:

$stmt = $this->mysqli->prepare("UPDATE radcheck SET attribute = ?, value = ? WHERE username = ? AND attribute LIKE 'CS-Total-Octets%'"); 
foreach ($usernames as $username) 
{ 
    $stmt->bind_param('sss', $bandwidth_types[$bandwidth_type], $bandwidth_bytes, $username); 
    $stmt->execute(); 
} 
$stmt->close(); 
+0

La tua risposta è più simile a una domanda in cui credo. Inoltre, il problema sarà che nelle istruzioni IN sfuggirà a più valori come un'unica stringa. –

Problemi correlati