我试图插入一个PHP函数到一个Foreach循环
中,以便为从db获取的变量$Match
的每一行生成值。
db查询本身工作正常,当我使用硬编码的值对其进行测试时,为变量$Match
赋值的函数工作正常,但当我尝试将其与代码的其余部分组合以使用db值时,它停止正常工作。具体来说:1)它只运行第一个IF语句;2)如果该语句为真,则为每一行添加相同的值。
我已经上传了一个带有硬编码值的函数示例到这个沙盒中http://sandbox.onlinephpfunctions.com/code
声明测试用例的值:
$User_Waist = "26";
$User_Hip = "38";
$Match = Null;
$waistMatch = Null;
$hipMatch = Null;
查询数据库
$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();
后续
这是prepare
中的SQL文本。
(我注意到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",...
^^^^^^^^^^^^^^^^^^
这实际上是在说“嘿!在准备好的语句的SQL文本中有一个字符串文本”:self_Measurement'
”,并说“使用这个值代替该字符串文本…”。
但问题是,该字符串文本不会出现在SQL文本中。语句中没有绑定占位符。(甚至没有其他名称的占位符,我在SQL中的任何地方都看不到任何冒号字符。)
我很惊讶PDO没有抛出错误。实际上,PDO可能抛出了一个错误,但是您的代码忽略了它。如果您的代码不检查从准备
,执行
等返回的返回,那么您可以让PDO通过在连接上指定属性来进行检查并为您抛出异常。
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
而且
在一个预先准备好的语句中,包含PHP变量$User\u Hip
和$User\u Hip
有点不寻常。预处理语句的好处之一是,表示值的变量可以替换为绑定占位符。
(我被你想做的事情弄糊涂了,我无法告诉你如何修复它。)