php - 从等于行名的表中选择 id

标签 php mysql pdo

我试图将从 $_SESSION 获得的用户名的 ID 存储到一个变量,但我无法使 SQL 语句工作。用户名存储在名为用户的数据库中,并以 ID 作为主键。有人可以告诉我如何纠正这个问题吗?谢谢

$name = $_SESSION['username']; //get username of user currently logged in

$rid = $db->exec("SELECT id FROM users WHERE username = '$name'");

最佳答案

来自 PDO::exec() 的 PHP 文档:

PDO::exec() does not return results from a SELECT statement. For a SELECT statement that you only need to issue once during your program, consider issuing PDO::query(). For a statement that you need to issue multiple times, prepare a PDOStatement object with PDO::prepare() and issue the statement with PDOStatement::execute().

这意味着您不能在 SELECT 查询上使用 exec() - 相反,您必须使用 query()prepare() .对于使用变量或用户输入的任何查询,请在变量查询中使用 prepare() 和占位符,以保护您的数据库免受SQL 注入(inject)

$stmt = $db->prepare("SELECT id FROM users WHERE username = :name");
$stmt->execute(["name" => $name]);
if ($row = $stmt->fetch()) {
    // $row holds the id
} else {
    // No rows were returned at all! No matches for $name
}

现在,如果查询返回任何结果,$row 会保存 id。根据您的获取类型,它可能是 $row['id']$row[0]$row->id或这些的组合。

如果你期望不止一个结果,你需要循环while ($row = $stmt->fetch()),或者使用$stmt->fetchAll();

关于php - 从等于行名的表中选择 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43333786/

相关文章:

mysql - 将 SQL 查询从 Postgres 移动到 MariaDB 时出错

mysql - 如何在MySQL中从子存储过程返回更新的行数给父存储过程?

mysql - 获取两个时间戳之间的所有行

PHP PDO PostgreSQL -> 插入/更新日期或时间戳数组,以及 bool 值

PHP 和报价

php - mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows等…期望参数1为资源或结果

php - 0 值而不是 MySQL 列中的 NULL

php - PDO 循环并打印 fetchAll

php - 我可以在 PHP 中混合使用 MySQL API 吗?

php - 使用 Zend Db Api 实现 where IN 子句