MySQL запрос с использованием массива - PullRequest
0 голосов
/ 09 июля 2009

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

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

Затем я хочу поместить все имена в массив, чтобы я мог выполнить свой следующий запрос: выбрать все строки из другой таблицы, столбец «client» которой равен одному из имен, возвращаемых в первом запросе. Я делаю что-то не так, потому что он возвращает фатальную ошибку 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);

}

Ответы [ 4 ]

5 голосов
/ 09 июля 2009

Второй запрос должен использовать $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, вы захотите немного его исправить. Просто к вашему сведению. : -)

0 голосов
/ 09 июля 2009

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

$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);
0 голосов
/ 09 июля 2009

Попробуйте:

$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 */

}
0 голосов
/ 09 июля 2009

Пара вещей. Сначала у вас там ненужный цикл. Попробуйте:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...