2010-03-25 2 views
1

Я знаю, что об этом допрашивали и отвечали раньше, но для жизни меня не могу найти, где я иду не так. Мой код ниже.Предложение Mysql IN, php array

$backa = array("1", "7", "8", "9", "12"); 
$backaa = implode(",", $backa); 
/* code to create connection object $wkHook */ 
$getOpt=$wkHook->prepare("select movementId, movementName from Movement where movementId IN ($backaa) order by movementName asc"); 
$getOpt->execute(); 
$getOpt->store_result($id, $name); 

Каждый раз, когда я запускаю это я получаю один из двух ошибок в зависимости от того, как я использую переменную $ backaa. Чаще всего я получаю вызов не-объектной ошибки, указывающей, что $ getOpt не является надлежащим запросом Mysql. Я пробовал каждую форму цитаты, брекетинга и т. Д. Для переменной $ backaa, но она просто не работает для меня. Какую очевидную вещь мне не хватает?

+0

Возможно закрыть скобку? – Quassnoi

+0

Typo приведение кода здесь. Я никогда не смогу сделать кодовый тег правильно работать на этом сайте с первой попытки. Скобка верна в коде, который терпит неудачу. Это не проблема. – 2010-03-25 17:16:52

+1

Всякий раз, когда я получаю ошибку mysql, первое, что я делаю, это хранить строку запроса в переменной и печатать ее на экране, поэтому я могу точно видеть, что мой код собрал вместе. Что-то вроде пустого значения в массиве может привести к хаосу, и просто увидеть двойную запятую в моем запросе делает такую ​​вещь легкой. – keithjgrant

ответ

4

Разве вы не пропустите )? Он должен быть

$getOpt=$wkHook->prepare("select movementId, movementName from Movement where movementId IN ($backaa0) order by movementName asc"); 
+0

И проверьте имя $ backaa/$ backaa0 var, как сказал Jage –

2

В вашем запросе $ backaa0 и в вашем коде $ backaa. И вам не хватает «)».

$backaa = implode(",", $backa); 
/* code to create connection object $wkHook */ 
$getOpt=$wkHook->prepare("select movementId, movementName from Movement where movementId IN ($backaa0 order by movementName asc"); 
+0

Извините, я забил это в копии и прошёл, а затем сделал опечатку в ее исправлении. Исходный код ($ backaa) и не работает. – 2010-03-25 17:15:38

3

Как уже указывалось, ваш запрос является недопустимым SQL. Прочтите сообщения об ошибках: они там, чтобы помочь вам.

Независимо от того, если вы вводите значения параметров в простой SQL, вы пропускаете всю точку подготовленных операторов.

Ни одна из библиотек БД, с которыми я работал, поддерживает параметры поддержки, которые расширяются до нескольких параметров. В общем, вам нужно генерировать п различных параметров из вашего массива и связать их все по отдельности, так что вы в конечном итоге с:

$getOpt=$wkHook->prepare("select movementId, movementName 
    from Movement 
    where movementId IN (?, ?, ?, ?) 
    order by movementName asc"); 

Это легко автоматизировать с помощью комбинации array_keys() и implode().

+0

Нет, я уже делал это раньше, и это работает. Я просто испортил способ передачи переменной, и я не могу, чтобы жизнь меня помнила правильный способ сделать это. Я пробовал одинарные кавычки, двойные кавычки, скобки, скобки ... это сводит меня с ума. – 2010-03-25 17:23:30

+0

Затем поместите инструкцию if() вокруг инструкции execute. Он возвращает false, если сбой выполнения/запроса, после чего вы можете проверить '$ getOpt-> errorInfo()' для точного кода ошибки SQL и, скорее всего, полнотекстовую версию сообщения об ошибке, которая также, как правило, будет иметь некоторый контекст где в запросе возникла проблема. –

0

Если вы свяжете $ backaa, вы, по сути говоря:

...where movementId IN ('"1", "7", "8", "9", "12"') order by...

Престола, что происходит? Он рассматривается как 1 параметр, а именно строка, состоящая из чисел, запятых и кавычек. Поэтому я не вижу, как это будет работать.

Что касается привязки его как массива, это имеет большее значение, но похоже, что это не работает для вас, поэтому я не знаю.

Я думаю, что это будет работать:

...where movementId IN (".$backaa.") order by...

Но тогда вы на самом деле не связывание ничего, так что вы можете также разбить ваш real_escape_string(). Я подозреваю, что это могло быть так, как вы это делали раньше.

2

проблема заключается в лопаются, попробуйте:

$backaa = "'". implode("', '", $backa) ."'"; 
0

Вот моя реализация, если кто-то ищет ..

$ list = $ _POST ['list'];

// список - 3,2,4,5; commma отдельные значения

$ data = array ($ list);

$ data = implode (",", $ data);

$ sql = "SELECT phone_number ОТ pinvalidation ГДЕ phone_number IN ($ data);";

$ res = mysql_query ($ sql);