Синтаксис синтаксиса MYSQL IN не работает

Я пытаюсь получить записи из базы данных MYSQL на основе идентификаторов, содержащихся в массиве. Чтобы получить идентификаторы, мой код выглядит следующим образом:

$query="SELECT agent_id FROM agent_coverage WHERE primary_area LIKE '$search_term%'";
$result=mysqli_query($dbc, $query) or die("Could not obtain primary area coverage2");
while($r=mysqli_fetch_array($result))
{
    $agent_primary[]=$r['agent_id'];
}

Кажется, что это прекрасно работает при использовании print_r для доступа к данным массива.

Следующим моим оператором является следующее:

if(!empty($agent_primary))
{
    $ids=join(",", $agent_primary);
    $query5="SELECT * FROM detail_db WHERE user_id IN($ids)";
    $result5=mysqli_query($dbc, $query5) or die("Could not do SELECT");

    while($row=mysqli_fetch_array($result5))
    {
    //do stuff with results here.
    }
}

Это просто вызывает команду die() . Я попытался использовать implode вместо join без успеха.

edit:
die($dbc->error) after the failing query reveals the error to be: unknown column '' in where clause

0
var_dump ($ agent_primary) перечисляет возвращаемый массив
добавлено автор Sideshow, источник
array (17) {[0] => string (14) "33ln1357136085" [1] => string (14) "6sdn1357137233" [2] =>} Не удалось сделать массив joinUnknown column '33ln1357136085' in 'где clause ' Это сокращено + Я сгруппировал результаты, поскольку исходный вопрос был отправлен
добавлено автор Sideshow, источник
user_id действителен - ошибка неизвестного столбца относится к первому user_id, возвращаемому массивом $ agent_primary . Вот что меня смущает.
добавлено автор Sideshow, источник
Извините - неизвестный столбец '', где пункт
добавлено автор Sideshow, источник
mysqli_error появляется неизвестная строка и берет первый результат из массива
добавлено автор Sideshow, источник
$ dbc работает по всему коду, как видно из первого запроса к базе данных, возвращающего массив
добавлено автор Sideshow, источник
'$ dbc' определяется в начале скрипта. Это информация о соединении db.
добавлено автор Sideshow, источник
Я никогда не слышал об ошибке «неизвестной строки». Каково точное сообщение об ошибке?
добавлено автор Barmar, источник
Я знаю, что это так, поэтому я попросил вас опубликовать его.
добавлено автор Barmar, источник
Что показывает var_dump ($ agent_primary) ?
добавлено автор Barmar, источник
@Akam Если вы помещаете кавычки вокруг него, то это уже не список, разделенный запятыми.
добавлено автор Barmar, источник
Это произойдет, если один из значений agent_id - ``
добавлено автор Barmar, источник
Используйте die («Не удалось сделать SELECT:». $ Dbc-> error) , чтобы получить причину сбоя.
добавлено автор Barmar, источник
И как? Пожалуйста, покажите все соответствующие коды.
добавлено автор Chris, источник
Где указано $ dbc ?
добавлено автор Chris, источник
что делает var_dump ($ query5); output?
добавлено автор Stu, источник
используйте IN ('1', '2', ...)
добавлено автор user1646111, источник
не разделяя запятую, просто попробуйте!
добавлено автор user1646111, источник
используйте $ ids = "'". join ("', '", $ agent_primary). "'";
добавлено автор user1646111, источник
user_id не является допустимым именем столбца или?
добавлено автор user1646111, источник

6 ответы

Пытаться:

$agent_primary[]="'".$dbc->real_escape_string($r['agent_id'])."'";
1
добавлено
@Akam - В суде было много предложений, и они стали толстыми и быстрыми - в какой-то момент немного запутались :) Спасибо за вашу помощь.
добавлено автор Sideshow, источник
$ agent_primary [] = "'". $ r [' agent_id ']. "'"; кажется хорошо работает - это благодаря вашему предложению выше :)
добавлено автор Sideshow, источник
@Akam Я не мог сказать, что вы использовали в качестве аргумента для join() , одиночные и двойные кавычки похожи друг на друга в крошечном шрифте комментариев.
добавлено автор Barmar, источник
@Akam Извините, это было очень трудно прочитать в комментарии. И вы не использовали real_escape_string() , который необходим, чтобы избежать инъекции SQL.
добавлено автор Barmar, источник
@Sideshow: Я предложил сделать это от попрошайничества! но вы не применяли!
добавлено автор user1646111, источник
нет, вы спрашиваете людей и не следуете инструкциям!
добавлено автор user1646111, источник

Вы можете сделать это так

if(!empty($agent_primary))
{
    $ids=implode($agent_primary,",");
    $query5="SELECT * FROM detail_db WHERE user_id IN ($ids)";
    $result5=mysqli_query($dbc, $query5) or die("Could not do SELECT");

    while($row=mysqli_fetch_array($result5))
    {
    //do stuff with results here.
    }
}

Надеюсь это поможет

0
добавлено
$query="SELECT agent_id FROM agent_coverage WHERE primary_area LIKE '$search_term%'";
$result=mysqli_query($dbc, $query) or die("Could not obtain primary area coverage2");

$agent_primary=array();    

while($r=mysqli_fetch_array($result))
{
  array_push($agent_primary,$r['agent_id']);
}

тогда

if(!empty($agent_primary))
{
$ids=$agent_primary;
$query5="SELECT * FROM detail_db WHERE user_id IN($ids)";
$result5=mysqli_query($dbc, $query5) or die("Could not do SELECT");

while($row=mysqli_fetch_array($result5))
{
//do stuff with results here.
}
}

использовать это. Я думаю, это поможет вам.

0
добавлено
Это просто добавляет элемент в массив, как и исходный $ agent_primary [] = $ r ['agent_id']; . Это все еще массив. IN требует список, разделенный запятыми.
добавлено автор Barmar, источник
Я вижу ваш код: $ agent_primary = array ();
добавлено автор Barmar, источник
Как это может работать? $ ids - это массив, поэтому он просто интерполирует слово Array .
добавлено автор Barmar, источник
нет, не это. он удерживает $ r ['agent_id']. PLZ увидеть мой код.
добавлено автор ripa, источник
plz см. полный код. в моем коде здесь также есть array_push ($ agent_primary, $ r ['agent_id']); этот код
добавлено автор ripa, источник

edit: Оба запроса могут быть объединены с строкой JOIN

$query = "
    SELECT
        dd.user_id,
        dd.foo
    FROM
        tmp_agent_coverage as ac
    LEFT JOIN
        tmp_detail_db as dd
    ON
        ac.agent_id=dd.user_id
    WHERE
        ac.primary_area LIKE '$search_term%'
";
$result=mysqli_query($dbc, $query) or mysqliError($dbc, "Could not obtain primary area coverage2");
while($r=mysqli_fetch_array($result))
{
    echo $r['user_id'], ' ', $r['foo'], "\n";
}

edit2: автономный пример

<?php
$dbc = new mysqli('localhost', 'localonly', 'localonly', 'test');
if ($dbc->connect_error) {
    var_dump($mysqli->connect_errno, $mysqli->connect_error);
    die;
}
setup($dbc);
$search_term = 'xy';

$query = "
    SELECT
        dd.user_id,
        dd.foo
    FROM
        tmp_agent_coverage as ac
    LEFT JOIN
        tmp_detail_db as dd
    ON
        ac.agent_id=dd.user_id
    WHERE
        ac.primary_area LIKE '$search_term%'
";
$result=mysqli_query($dbc, $query) or mysqliError($dbc, "Could not obtain primary area coverage2");
while($r=mysqli_fetch_array($result))
{
    echo $r['user_id'], ' ', $r['foo'], "\n";
}

define('DEVELOPMENT_DEBUG_MESSAGES', 1);
function mysqliError($dbc, $description) {
    if ( !defined('DEVELOPMENT_DEBUG_MESSAGES') || !DEVELOPMENT_DEBUG_MESSAGES ) {
        echo '<div class="error">', htmlspecialchars($description), '</div>';
    }
    else {
        echo '
', htmlspecialchars($description), '', htmlspecialchars($dbc->error), '</div>'; } } function setup($dbc) { $q = array( 'CREATE TEMPORARY TABLE tmp_agent_coverage ( agent_id int auto_increment, primary_area varchar(32), primary key(agent_id), key(primary_area) )', "INSERT INTO tmp_agent_coverage (primary_area) VALUES ('xy1'),('dfg'),('xy2'),('abc'),('xy3')", 'CREATE TEMPORARY TABLE tmp_detail_db ( user_id int auto_increment, foo varchar(32), primary key(user_id) )', "INSERT INTO tmp_detail_db (foo) VALUES ('fooxy1'),('foodfg'),('fooxy2'),('fooabc'),('fooxy3')" ); foreach($q as $query) { $dbc->query($query) or die(__LINE__ .' '.$query. ' '. $dbc->error); } }

prints

1 fooxy1
3 fooxy2
5 fooxy3

original answer:
mysqli::query returning false means that an error occured while executing the query. That could be e.g. a syntax error or privileges or ... or ...
The error and errno properties of your $dbc object should hold more detailed information about the error. But you shouldn't show the complete error message to just any arbitrary user.
So, for debugging purposes define a function like

define('DEVELOPMENT_DEBUG_MESSAGES', 1);
function mysqliError($dbc, $description) {
    if ( !defined('DEVELOPMENT_DEBUG_MESSAGES') || !DEVELOPMENT_DEBUG_MESSAGES ) {
        echo '<div class="error">', htmlspecialchars($description), '</div>';
    }
    else {
        echo '
', htmlspecialchars($description), '', htmlspecialchars($dbc->error), '</div>'; } }

and then use this function in your code like

<?php
define('DEVELOPMENT_DEBUG_MESSAGES', 1);
[...]
$query="SELECT agent_id FROM agent_coverage WHERE primary_area LIKE '$search_term%'";
$result=mysqli_query($dbc, $query) or mysqliError($dbc, "Could not obtain primary area coverage2");

remove the define(...) line when you're done debugging.

0
добавлено
Он уже отправил сообщение об ошибке.
добавлено автор Barmar, источник
скрытый где-то в комментариях ....
добавлено автор VolkerK, источник

попробуй это

 $ids=join("','", $agent_primary);
 $query5="SELECT * FROM detail_db WHERE user_id IN('$ids')";

Я попробовал его в своем локальном хосте, и он отлично работает!

0
добавлено

Используйте implode для создания строки и добавления скобок вокруг нее.

Получите значения идентификаторов в массиве, а затем взорвите его. Посмотрите ниже пример - это работает.

 $arr = array(1,297,298);
    $new = '(';
    $new .= implode(',',$arr);
    $new .= ')';
    $query = "Select * from wp_posts where ID IN $new";
0
добавлено
Да - он получает массив всех идентификаторов агентов, которые соответствуют определенным критериям
добавлено автор Sideshow, источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp