mysql — Трудность связать правильные значения $ var и строки БД в этом выражении PHP foreach

Я пытаюсь вставить функцию PHP в foreach loop для того, чтобы генерировать значения для каждой строки fetched из БД для variable $Match,

Сам запрос БД работает правильно, а функция, которая присваивает значения variable $Match работает правильно, когда я тестирую его с жестко закодированными значениями, но когда я пытаюсь объединить его с остальным кодом, чтобы использовать значения БД, он перестает работать должным образом. В частности: 1) выполняется только первый оператор IF; и 2) Если это утверждение верно, оно добавляет одно и то же значение для каждой строки.

Я загрузил функциональный пример с жестко закодированными значениями в эту песочницу http://sandbox.onlinephpfunctions.com/code

Объявление значений для теста:

$User_Waist = "26";
$User_Hip = "38";
$Match = Null;
$waistMatch = Null;
$hipMatch = Null;

База данных запросов & fetchAll

$stmt = $conn - > prepare("SELECT * FROM SizeChart WHERE FIND_IN_SET($User_Waist, Waist_Measurement) > 0 OR FIND_IN_SET($User_Hip, Hip_Measurement) > 0;");
$stmt - > bindValue(':Waist_Measurement', $Waist_Measurement, PDO::PARAM_STR);
$stmt - > bindValue(':Hip_Measurement', $Hip_Measurement, PDO::PARAM_STR);
$stmt - > execute();
$rows = $stmt - > fetchAll(PDO::FETCH_ASSOC);

Перебрать результаты

$count = 0;
foreach($rows as $row) {
$count++;

Добавляет значение в переменную $ Match

    if (strpos($row['Waist_Measurement'], $User_Waist) !== false) {
$waistMatch = 'waistFit';
}
if (strpos($Hip_Measurement, $User_Hip) !== false) {
$hipMatch = 'hipFit';
}
$Match = $waistMatch.', '.$hipMatch;

Показать результаты

echo "Size #: ".$row['Size'].";   Fit Matches: ".' '.$Match.";  Waist: ".$row['Waist_Measurement'], "; Hip: ".$row['Hip_Measurement'], ".<br />";

1

Решение

Текст SQL не содержит заполнителей связывания :Waist_Measurement или же :Hip_Measurement,

bindValue вызовы не будут работать, так как нет никакого заполнителя указанного имени, к которому можно привязать значение.

Вот пример, который использует заполнитель связывания с именем :fum, Обратите внимание, что эта строка появляется и то и другое в тексте SQL и в качестве аргумента для bindValue или bindParam.

$foo = "bar";
$sql = "SELECT fee FROM fi WHERE fo = :fum ";
//                                    ^^^^
$sth = $dbh->prepare($sql);
$sth->bindValue(":fum", $foo, PDO::PARAM_STR);
//               ^^^^
$sth->execute();

СЛЕДОВАТЬ ЗА

Это текст SQL в вашем prepare,

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

   SELECT *
FROM SizeChart
WHERE FIND_IN_SET($User_Waist, Waist_Measurement) > 0
OR FIND_IN_SET($User_Hip, Hip_Measurement) > 0

Но дело в том, что в этом тексте SQL нет никаких заполнителей связывания. Когда вы делаете:

   ->bindValue(":Waist_Measurement",...
^^^^^^^^^^^^^^^^^^

По сути, это говорит: «Эй! Там строковый литерал ':Waist_Measurement' в тексте SQL подготовленного оператора «и говоря» вместо этого строкового литерала, используйте это значение … «.

Но дело в том, что строковый литерал делает не появляются в вашем тексте SQL. В заявлении нет обязательного заполнителя. (Там даже нет заполнителя с другим именем, я не вижу любой символы двоеточия в любом месте SQL.)

Я удивлен, что PDO не выдает ошибку. На самом деле, PDO, вероятно, выдает ошибку, но ваш код игнорирует ее. Если ваш код не собирается проверять возврат от prepare, execute, и другие. тогда вы можете заставить PDO выполнить проверку и выдать за вас исключение, указав атрибут соединения.

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Также…

Включение переменных PHP $User_Waist а также $User_Hip немного необычно в готовом утверждении. Одним из преимуществ подготовленных операторов является то, что переменные, представляющие значения, могут быть заменены на заполнители связывания.

(Меня смущает то, что вы пытаетесь сделать, я не могу сказать вам, как это исправить.)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]