2011-08-12 9 views
11

mój kod:wiążące parametry WHERE IN z PDO

$myArray = implode($myArray, ','); 
$sth = $dbh->prepare('SELECT foo FROM bar WHERE ids IN (:ids)'); 
$sth->bindParam(':ids', $myArray); 
$sth->execute(); 
$result = $sth->fetch(); 
echo $sth->rowCount(); 

Zawsze pokazuje liczbę 1, ale kiedy pominąć parametryzację i wystarczy dodać samą zmienną w jego miejsce, uzyskać dokładne policzyć. Co tu się dzieje?

Odpowiedz

12

Nie można powiązać parametru dla takiej klauzuli IN. Ciąg $ myArray będą się liczyć tylko jedną wartość, jak gdybyś to zrobił:

SELECT foo FROM bar WHERE ids IN ('1,2,3') 

Chociaż istnieją trzy oddzielonych przecinkami wartości w bazie danych odczytuje je jako tylko jeden ciąg znaków.

Musisz ręcznie wstawić listę IN do zapytania, w oldschoolowy sposób.

'SELECT foo FROM bar WHERE ids IN (' . $myArray .')' 

Niestety nie ma innej drogi. Przynajmniej na razie.

+7

Poważnie? Przygotowane oświadczenia nie mogą tego znieść? Jak lame to:/ – hoppa

+0

uważaj na wtrysk sql. – Dani

+5

@hoppa: mogą sobie z tym poradzić: 'id IN (: id1,: id2,: id3 ...)', otrzymasz wzorzec. Lepiej z metodą oldschoolową. – Maerlyn

6

Wiem, że to pytanie jest stary, ale działa to dla mnie:

$arrayOfValues = array(1,2,3,4,5); 
$questionMarks = join(",", array_pad(array(), count($arrayOfValues), "?")); 
$stmt = $dbh->prepare("update some_table set end_date = today where value_no in ($questionMarks)"); 
$stmt->execute($arrayOfValues); 
0

Dlaczego nie korzystać z tego rozwiązania?

https://stackoverflow.com/a/39353278/1834212

Analizuje się szereg wartości, które są pary zastępcze wiązania i jego elementy, w przypadku IN wystarczy do zasilania tablicy, a następnie będzie analizować tablicy i modyfikować ciąg znaków dla ciebie, używając nazw skojarzeń generowanych w locie, a następnie podawaj te wartości z tablicy

Powiązane problemy