Запрос MySQL с использованием массива

Я пытаюсь запросить базу данных MySQL, используя массив, но у меня проблемы!

У меня есть таблица, называемая клиентами, я хочу иметь возможность выбирать «имя» из всех строк, чей столбец «сектор» равен $ sectorlink.

Затем я хочу поместить все имена в массив, чтобы я мог выполнить свой следующий запрос: выберите все строки из другой таблицы, столбец «клиент» равен одному из имен, возвращенных из первого запроса. Я делаю что-то неправильно, потому что он возвращает фатальную ошибку SQL. Я запутался со всеми переменными!

$ sectorlink и $ connection являются единственными переменными, которые определены вне этого кода

Какие-либо предложения?

$query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'"; $clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR); while($row = mysql_fetch_array($clientresult)){ foreach($row AS $key => $value){$temp[] = '"'.$value.'"';} $thelist = implode(",",$temp); $query = "SELECT count(*) FROM studies WHERE client IN ($row) ORDER BY (date) desc"; $result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR); } 

Related of "Запрос MySQL с использованием массива"

Второй запрос должен использовать $thelist не $row , и он должен быть вне цикла while. Цикл foreach не нужен при обработке одной строки. Вы можете получить доступ к имени в $row с помощью простой $row[0] . Что-то вроде этого (непроверено):

 $query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'"; $clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR); while($row = mysql_fetch_array($clientresult)){ $temp[] = '"'.$row[0].'"'; } $thelist = implode(",",$temp); $query = "SELECT count(*) FROM studies WHERE client IN ($thelist) ORDER BY (date) desc"; $result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR); 

Внимание! Помните, что ваш код очень уязвим для атак SQL-инъекций . Это нормально для тестирования или внутреннего развития, но если этот код будет работать на веб-сайте Fort Knox, вы захотите его исправить совсем немного. Просто FYI. 🙂

Попробуй это:

 $query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'"; $clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR); while($row = mysql_fetch_array($clientresult)){ $client = $row['name']; $query = "SELECT * FROM studies WHERE client='$client' ORDER BY date DESC"; $result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR); /* echo results here */ } 

Пара вещей. Сначала у вас есть ненужный цикл. Пытаться:

 while (list($name) = mysql_fetch_row($clientresult)) { $temp[] = $name; } 

Чтобы создать свой временный массив.

Во-вторых, части предложения IN являются строками, поэтому, когда вы взорваетесь, вам нужно заключить каждое значение в кавычки:

 $thelist = "'". implode("','", $temp) . "'"; 

Наконец, в вашем запросе вы передаете $row в предложение IN , вы должны передать $thelist :

 $query = "SELECT count(*) FROM studies WHERE client IN ($thelist) ORDER BY date desc"; $result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR); 

Так что вообще:

 $query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'"; $clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR); while (list($name) = mysql_fetch_row($clientresult)) { $temp[] = $name; } $thelist = "'". implode("','", $temp) . "'"; $query = "SELECT count(*) FROM studies WHERE client IN ($thelist) ORDER BY date desc"; $result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR); 

Я ожидаю, что вам будет лучше сделать это в одном запросе с соединением:

 $query = "SELECT COUNT(*) FROM `studies` INNER JOIN `clients` on studies.client = clients.name WHERE clients.sector = '$sectorlink' ORDER BY studies.date DESC"; $result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);