为什么我收到警告:使用 PDO::fetchColumn 时出现非法字符串偏移量


Why do I get Warning: Illegal string offset when using PDO::fetchColumn?

如果用户尚未上传个人资料图片,我正在尝试输出用户个人资料图像或显示虚拟图像。从数据库中提取此信息的查询工作正常。我使用了一个"if"语句来检查该行是否包含值,这一直有效,直到我尝试从数据库中回显某些内容,例如文件路径。然后我得到这个错误:

警告:非法字符串偏移

图像也没有显示,我得到

未找到对象

请参阅下面的代码。我将不胜感激任何建议。

$query = $db->query("SELECT * from members where username = '".$_SESSION['username'] ."'");
$row = $query->fetchColumn();
if (isset($row) && $row == true) {
    echo '<img width="100" height="100" src="'.$row["profile_pic"].'"/>';
} else {
    echo "no profile pic";
}

使用 fetchColumn() 的好处是它返回单个值。这可以通过消除在只需要一列中的值时引用数组键的必要性来稍微简化代码。它不起作用,因为您使用的是$row["profile_pic"]并且$row不是数组。

如果要使用 fetchColumn() ,则需要执行以下两项操作之一:

  1. 修改查询,使其仅获取所需的列,而不是使用*.那么你的代码将需要

    $query = $db->query("SELECT profile_pic from members...");
    $src = $query->fetchColumn();
    if ($src) {
        echo '<img width="100" height="100" src="'.$src.'"/>';
    
  2. fetchColumn()添加一个数字,指示所需的列来获取。那么你的代码将需要

    $query = $db->query("SELECT * from members...");
    $src = $query->fetchColumn(4);
    // or whatever the numeric index of the column you want is
    if ($src) {
        echo '<img width="100" height="100" src="'.$src.'"/>';
    

其中任何一个都应该有效。但是我还应该提到,如果您想使用查询中的任何其他列,则不应使用 fetchColumn() ,因为一旦完成此操作,您将无法访问查询结果该行中的任何其他列。如果是这种情况,您可以将抓取方式从

$row = $query->fetchColumn();

$row = $query->fetch(PDO::FETCH_ASSOC);

然后,您仍然可以从该行中获取其他列,并且仍然可以像在原始代码中一样使用$row["profile_pic"]


为了解决您的评论,我建议这样做以便在数据库中没有默认图像时显示默认图像,如果它为空,则$src设置为默认图像路径,如下所示:

$src = $query->fetchColumn();
if (!$src) {
    $src = 'default_image.png'; // or whatever the path/filename is
}
echo '<img width="100" height="100" src="'.$src.'"/>';