PHP SQL с проблемой переменной цикла foreach

0

Это действительно расстраивает. У меня есть текстовый файл, который я читаю для списка номеров деталей, которые входят в массив. Я использую следующую функцию 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 из этого script, скопировать и вставить инструкцию из браузера, и она работает. Но по какой-то причине я не получаю никаких записей, когда я использую переменную. Я использовал переменные в sql-операциях много раз, но это действительно меня озадачило.

  • 0
    Я понятия не имею, почему форматирование кода облажался. Выглядело хорошо, прежде чем я представил его
  • 0
    Вы, вероятно, использовали вкладки, а не 4 пробела.
Показать ещё 4 комментария
Теги:
foreach

6 ответов

2
  • Попробуйте выполнить обрезку и mysql_real_escape_string для вашей переменной.
  • Проверьте исходный код того, что эхоподавляется, и попытайтесь скопировать и вставить его в PHPMyAdmin или что-то подобное.
  • 1
    Акцент на обрезке с использованием trim()
1

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

$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
    Использование mysqli на стороне сервера подготовленных операторов также является еще одним вариантом. Mysqli обычно рекомендуется поверх старой библиотеки php mysql.
0

Я знаю, что сейчас это довольно старомодно, но я хотел бы помочь другим людям, которые могут столкнуться с аналогичной проблемой с операторами 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

Как выглядит ваш файл part_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

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

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

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

0

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

Моя идея:

  • запишите свой оператор sql из foreach
  • проверьте код возврата mysql_query

Ещё вопросы

Сообщество Overcoder
Наверх
Меню