PHP SQL с проблемой переменной цикла foreach - PullRequest
0 голосов
/ 11 июня 2010

Это действительно расстраивает. У меня есть текстовый файл, который я читаю для списка номеров деталей, который входит в массив. Я использую следующую функцию foreach для поиска в базе данных соответствующих номеров.

$file = file('parts_array.txt');

foreach ($file as $newPart)
{
    $sql = "SELECT products_sku FROM products WHERE products_sku='" . $newPart . "'";
    $rs = mysql_query($sql);
    $num_rows = mysql_num_rows($rs);

    echo $num_rows;
    echo "<br />";
}

Проблема в том, что я получаю 0 строк, возвращаемых из mysql_num_rows. Я могу напечатать оператор SQL без переменной, и она отлично работает. Я даже могу вывести SQL-оператор из этого скрипта, скопировать и вставить оператор из браузера, и он работает. Но по какой-то причине я не получаю никаких записей, когда использую переменную. Я использовал переменные в SQL-выражениях множество раз, но это действительно поставило меня в тупик.

Ответы [ 6 ]

2 голосов
/ 11 июня 2010
  1. Попробуйте обрезать и mysql_real_escape_string в своей переменной.
  2. Проверьте исходный код того, что выводится на экран, и попытайтесь скопировать и вставить это в PHPMyAdmin или что-то подобное.
1 голос
/ 11 июня 2010

файл включает в себя новые строки в элементах массива.Это может объяснить, почему это работает, когда вы копируете выходные данные браузера, но не в сценарии.Вы можете попробовать:

$file = file('parts_array.txt', FILE_IGNORE_NEW_LINES);

или:

$sql = "SELECT products_sku FROM products WHERE products_sku='" . trim($newPart) . "'";

Примечание. Даже если вы импортируете файл собственного производства, вы не можете быть на 100% уверены, что инъекцияданные не были вставлены в него.Вы должны убедиться, что правильно экранировали все данные с помощью mysql_real_escape_string .Еще лучше было бы использовать вместо этого подготовленные операторы PDO.

0 голосов
/ 24 апреля 2013

Я знаю, что это довольно старое время, но я хотел бы помочь другим, кто также может столкнуться с подобной проблемой с операторами SQL, которые должны содержать сгенерированные потенциально бесконечные числа параметров поиска.

Код в вопросе задающего является совершенно верным (во избежание сомнений) [см. Ниже]:

$file = file('parts_array.txt');

foreach ($file as $newPart)
{
    $sql = "SELECT products_sku FROM products WHERE products_sku='" . $newPart . "'";
    $rs = mysql_query($sql);
    $num_rows = mysql_num_rows($rs);

echo $num_rows; 
echo "<br />";

}

Их проблема заключается в форматировании их текстового файла ('parts_array.txt'). Первопричину проблемы можно найти, сбросив информацию, отправленную обратно сервером. В качестве альтернативы - они могут попробовать написать SQL-запрос в PHPMyAdmin и вставить некоторые или все данные в свой текстовый файл. MySQL будет радовать их, пока они не найдут проблему.

Для тех, кто пытается реализовать SQL-запрос, основанный на переменных - вышеописанный способ. Если вы пытаетесь получить данные из массива вместо текстового файла, вы можете сделать что-то вроде следующего:

foreach ($array as $array_stuff)
{
    $search_query = "SELECT * FROM table WHERE id='" . $array_stuff . "'";
    $rs = mysqli_query($database_connection, $search_query);
    $table_rows = mysqli_fetch_assoc($rs);

    echo $table_rows['id']." - ".$table_rows['desc'];
    echo "<br />";
}

/* free result set */
mysqli_free_result($rs);

Это выведет ваши данные так:

1001 - данные 1
1002 - данные 2
1003 - данные 3

Примечание: MySQL активно не рекомендует использовать функции «mysql». Поэтому второй пример, который я привел выше, более актуален с современными технологиями и использует вместо него «mysqli».

Также важно

Если вы находитесь здесь из поиска Google в результате попытки получить данные из базы данных, используя сложный SQL-запрос, вы, возможно, уже пытались сделать что-то вроде приведенного ниже примера (или рассматриваете его).

Не пытаться написать SQL-запрос на основе переменных, как показано в примере ниже. Это не сработает и будет невероятно разочаровывающим.

Основываясь на последних технологических достижениях - второй пример, который я привел (используя «mysqli»), - правильный способ (если он есть) для достижения этой цели.

Плохой пример:

if ($search_result = mysqli_query($dbh1, "SELECT FROM sic_codes WHERE id = (".foreach ($_POST['SIC_Codes'] as $sic_codes) {echo "'".$sic_codes."' OR id = '',";})) {
/* fetch associative array */
while ($search_row = mysqli_fetch_assoc($search_result)) {
    echo $row["id"]." - ".$row["desc"]."<br/>";
}
0 голосов
/ 12 июня 2010

Возможно, вы захотите проверить mysql_error.Похоже, вы уже проверили переменную и скопировали запрос в интерфейс базы данных, такой как PHPMyAdmin или Query Browser, но если вы этого не сделали, я бы порекомендовал.
После этого убедитесь, что очень простой запрос будет работатькак SELECT * FROM Products.Это скажет вам, если есть проблема за пределами запроса.

В целом, я бы сказал, что стратегия состоит в том, чтобы разбить проблему на возможные проблемные области, такие как база данных, соединение, запрос, ошибки и т. Д. Постарайтесь устранять их по одному, пока проблема не станет очевидной.Другими словами, перечислите возможности и вычеркните их по одному.

Я сталкивался с подобными проблемами раньше;трюк обычно состоит в том, чтобы начать повторять вещи, пока вы не увидите проблему, и не отрабатывать предположения.

0 голосов
/ 12 июня 2010

Как выглядит ваш файл parts_array.txt?Номера SKU содержат символ '?

Можете ли вы попробовать это:

$file = file('parts_array.txt');

foreach ($file as $line_num => $line)
{
    $sql = "SELECT products_sku FROM products WHERE products_sku='$line'";
    echo $sql;
    $rs = mysql_query($sql);
    $num_rows = mysql_num_rows($rs);

    echo $num_rows;
    echo "<br />";
}
0 голосов
/ 12 июня 2010

Очевидно, ваш код делает что-то другое, чем вы ожидаете. Выполнение успешного запроса, например: вы не проверяете возвращаемое значение вызова mysql_query, поэтому вы не можете быть уверены, что запрос выполнен нормально.

Моя идея:

  1. сбросить ваш SQL-оператор из foreach
  2. проверьте код возврата mysql_query
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...