Я пытаюсь вставить функцию 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 />";
Текст 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
немного необычно в готовом утверждении. Одним из преимуществ подготовленных операторов является то, что переменные, представляющие значения, могут быть заменены на заполнители связывания.
(Меня смущает то, что вы пытаетесь сделать, я не могу сказать вам, как это исправить.)
Других решений пока нет …