2012-10-25 9 views
5

Für SQL IN-Klausel, wie bearbeite ich eine unbekannte Anzahl von Parametern beim Binden von SQL mit PHP OCI8?PHP OCI8 bind (unbekannte Anzahl von) Parameter für 'IN' Anweisung

Zum Beispiel angesichts die folgende Abfrage

und das Array von Variablen

$bind_array = array(
    ':id_1' => '1', 
    ': id_array_of_unknown_size' => array('7','2','5',), 
); 

Auch seinen wichtig zu binden, dass in meiner besonderen Situation zu beachten, der Eingang array($bind_array) kann oder nicht enthalten ein Unterfeld für das Bindeelement. Es könnte genauso gut die folgenden

select * from table1 
where id > :id_1 
and id != :id_2 

und

$bind_array = array(
    ':id_1' => '1', 
    ':id_2' => '5', 
); 
+1

können Sie IN in Oci binden? Ich denke, in PDO können Sie nicht an IN binden – JvdBerg

Antwort

2

Eine Möglichkeit ist, die Bindung eines kleinen festen Anzahl von Werten in einer Klausel IN wie in der Dokumentation von oci_bind_by_name beschrieben. Es gibt auch eine Lösung, um mehrere Bedingungen mit einer variablen Anzahl von Werten zu verknüpfen.

<?php 
$ids = array(
    103, 
    104 
); 

$conn   = oci_pconnect($user, $pass, $tns); 
// Using ORACLE table() function to get the ids from the subquery 
$sql   = 'SELECT * FROM employees WHERE employee_id IN (SELECT column_value FROM table(:ids))'; 
$stmt   = oci_parse($conn, $sql); 
// Create collection of numbers. Build in type for strings is ODCIVARCHAR2LIST, but you can also create own types. 
$idCollection = oci_new_collection($conn, 'ODCINUMBERLIST', 'SYS'); 

// Maximum length of collections of type ODCINUMBERLIST is 32767, maybe you should check that! 
foreach ($ids as $id) { 
    $idCollection->append($id); 
} 

oci_bind_by_name($stmt, ':ids', $idCollection, -1, SQLT_NTY); 
oci_execute($stmt, OCI_DEFAULT); 
oci_fetch_all($stmt, $return); 
oci_free_statement($stmt); 

oci_close($conn); 

?> 
Verwandte Themen