我编写了以下代码以从表中返回单个值,但它似乎不起作用。知道为什么吗?
$pmname = $pdo->quote($_SESSION['pmname']);
$sql = "SELECT img FROM pm_user WHERE name=$pmname";
$result = $pdo->query($sql);
foreach ($result as $row)
{
echo $row["img"];
}
为什么你什么都不做fetch
?尝试foreach
替换为:
while($row = $result->fetch(PDO::FETCH_ASSOC))
{
echo $row['img'];
}
甚至,如果您确定只有一行:
$row = $pdo->query('your query')->fetch(PDO::FETCH_ASSOC);
echo $row['img'];
可以很好地做到这一点,虽然我还没有尝试过 - 还没有。
你需要做一个fetch
地方。如果您想使用foreach
结构,请将结果集存储在一个变量中,fetchAll
然后循环遍历它。
$pmname = $pdo->quote($_SESSION['pmname']);
$sql = "SELECT img FROM pm_user WHERE name=$pmname";
$rows = $pdo->query($sql)->fetchAll();
foreach ($rows as $row)
{
echo $row["img"];
}
编辑 - 更重要的是:
您不应该只是$pmname
通过该quote
方法传入。请参阅 PHP 手册 PDO::quote
如果您使用此函数构建 SQL 语句,强烈建议您使用 PDO::prepare() 来准备带绑定参数的 SQL 语句,而不是使用 PDO::quote()
你真的应该这样做:
$sql = "SELECT img FROM pm_user WHERE name=:pmname";
$stm = $pdo->prepare( $sql );
$stm->execute( array( ':pmname' => $_SESSION['pmname'] ) );
$rows = $stm->fetchAll();
foreach ($rows as $row)
{
echo $row["img"];
}
您应该始终检查输入数组变量的 foreach 和从数据库返回的行数。当您没有得到任何查询数据库的值时,可以避免生产代码中的警告/错误。
在您的示例中,您可以使用 empty() php 函数进行检查。例如:
$pmname = $pdo->quote($_SESSION['pmname']);
$result = $pdo->query("SELECT img FROM pm_user WHERE name=$pmname");
if($pdo->rowCount() > 0 && !empty($result))
{
foreach ($result as $row)
{
echo $row["img"];
}
}
else
{
echo 'No user image found in database.';
}