MySQL查询后foreach未给变量赋值

时间:2019-05-28 20:52:56

标签: php mysql foreach

我正在尝试创建一个PHP函数,该函数将允许我将MySQL数据库中的user_id转换为用户名(因为我正在处理的分配需要完成很多工作,因此我宁愿只调用一个功能来快速做到这一点,而不是重复自己)

我遇到的问题是我无法将查询返回的值分配给导致未定义变量错误的变量。

该函数是从其他.php脚本中调用的,因此我需要返回该值。调用该函数时,会将user_id作为参数传递。

我已经尝试在查询之前声明变量,并在foreach循环中分配值,但是我无法保存并返回值。

//Convert user_id to Username
function usernameConvert($userid)
{  
    //Connection to DB
    include '../dbconnect.php';

    $results = $pdo->prepare('SELECT username FROM users WHERE 
    user_id="$userid"');
    $results -> execute();


    foreach ($results as $row)
    {
        $username = $row["username"];
    }

    //comes back undefined
    return $username;
}

我得到的主要错误是它是一个未定义的变量。

谢谢。

1 个答案:

答案 0 :(得分:3)

您不能在单引号'的字符串中直接使用变量:

$foo = 'bar';
echo "hello $foo"; // hello bar
echo 'hello $foo'; // hello $foo

这将导致查询搜索等于字符串$suserid的用户ID,因为没有可能的结果,您的foreach循环运行了0圈,而$username是从未定义。


但是使用双引号 "会使查询vulnerable to SQL injection。您已经在使用准备好的语句,但是使用的是错误的方式。
具有命名参数的有效解决方案:

$results = $pdo->prepare('SELECT username FROM users WHERE user_id = :id');
$results->bindParam(':id', $userid, PDO::PARAM_INT);
$results->execute();

请参见PDOStatement::bindParam()


您还忘记使用fetch() (而不是fetchAll(),因为您正在基于主键搜索用户名。由于主键是唯一的,因此最多只能获得1行。因此,无需循环)

$results->execute();

$username = $results->fetch();

return $username;