【问题标题】:equaling the PHP argument and mysql data makes foreach loop not work等于 PHP 参数和 mysql 数据使 foreach 循环不起作用
【发布时间】:2015-08-24 17:34:44
【问题描述】:

当我在做这个 foreach 循环时,效果很好。

<?php
function checkInDB($NIC){
$user='root';
$pass='123';
$db='mysql:host=localhost;dbname=recruit';
$dbh= new PDO($db,$user,$pass);

$sql = 'SELECT FirstName 
         FROM cv 
           JOIN candidate ON cv.cvID=candidate.cvID 
         WHERE ((submittedDate > NOW() - INTERVAL 365 day) 
           AND (candidate.NIC="906548765V"))';

echo '<h3>candidates</h3>', '<hr />', PHP_EOL;
echo '<table border=1>', PHP_EOL;
foreach ($dbh->query($sql, PDO::FETCH_ASSOC) as $row) {

    echo '<tr><td>', implode('</td><td>', $row), '</td></tr>', PHP_EOL;
}
echo '</table>', PHP_EOL;
}
checkInDB("906548765V");

?>

但是当我将 (candidate.NIC="906548765V") 更改为 (candidate.NIC=$NIC) 这甚至使echo ($NIC==="906548765V"); 为真,引发意外错误

为 foreach() 提供的参数无效

那里到底发生了什么?

【问题讨论】:

标签: php mysql foreach quotes


【解决方案1】:

在 PHP 中有两种定义字符串的方法:

  • 双引号
  • 单引号

当您使用单引号时,字符串将按照定义。 使用双引号时,PHP 会解析字符串。

然后在另一个音符上。永远不要在查询字符串中包含变量。只是不要。 SQL注入等等。始终使用准备好的语句。您正在使用 PDO,所以很简单:

$stmt = $dbh->prepare('SELECT cols FROM table WHERE col1 = :myCol1Value');
$stmt->bindParam('myCol1Value',$theActualValue);
$stmt->execute();

【讨论】:

  • 我是 PHP 的完全初学者。所以,在我认为是 foreach 循环的区域中,问题甚至都不在附近!有用的建议。
  • 是的,查询不返回数组
【解决方案2】:

试试AND (candidate.NIC="'.$NIC.'"),因为它是一个字符串,你仍然需要引号。

【讨论】:

  • 不知道为什么这被否决了...这是一个有效的答案(尽管在 MySQL 中使用单引号比双引号更好),但是 Pinoniq 更适合最好的方法这个。
  • 这不是一个很好的答案,你应该解释为什么这会解决问题。
猜你喜欢
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
相关资源
最近更新 更多