Я пытаюсь запросить базу данных 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); }
Второй запрос должен использовать $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);