Php 从与行名称相等的表中选择id

Php 从与行名称相等的表中选择id,php,mysql,pdo,Php,Mysql,Pdo,我试图将从$\u SESSION获取的用户名id存储到变量中,但无法使SQL语句正常工作。用户名存储在名为users的数据库中,并以ID作为主键。有人能告诉我如何纠正这个问题吗?谢谢 $name = $_SESSION['username']; //get username of user currently logged in $rid = $db->exec("SELECT id FROM users WHERE username = '$name'"); 从PDO::exec()

我试图将从
$\u SESSION
获取的用户名id存储到变量中,但无法使SQL语句正常工作。用户名存储在名为users的数据库中,并以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()不从SELECT语句返回结果。对于只需要在程序中发出一次的SELECT语句,请考虑发布PDO::Quices()。对于需要多次发出的语句,请使用PDO::prepare()准备PDOStatement对象并使用PDOStatement::execute()发出该语句

这意味着您不能在SELECT查询中使用
exec()
,而必须使用
query()
prepare()
。对于使用变量或用户输入的任何查询,请在变量查询中使用
prepare()
和占位符,如下所示,以保护数据库不受SQL注入的影响

现在,如果查询返回任何结果,则
$row
将保留id。根据您的提取类型,它可能是
$row['id']
$row[0]
$row->id
,或者它们的组合

如果希望得到多个结果,则需要在($row=$stmt->fetch())期间循环
,或者使用
$stmt->fetchAll()


要么没有与测试用户名匹配的id,要么exec函数没有正确执行它的工作。@AndrewLarsen是后者,我认为查询有缺陷。我有权假设这是PDO吗@noob如果是这种情况,将PDO设置为抛出异常,使用try/catch并将实际错误抛出给您。在不知道的情况下,这只是一个猜测。会议开始了吗?这个变量有值吗?该值是否正确?是否可以打印或显示会话用户名以确认会话是否正确empty@thenoob文档:-基本上将您的连接和
exec()
方法包装在
try
块中,并在其后面加上
catch(PDOException$e){print_r($e);}
。当然还有PHP错误报告、检查日志等。不过您需要设置PDO以引发异常。谢谢您,它已经修复了。但是当我尝试将$row插入db时,我得到了一个数组到字符串转换的错误,这是因为您需要使用
$row['id']
$row[0]
,而不是
$row
(这是一个数组!),这取决于您的获取类型-阅读答案中的最后两段,就在两个链接上方。
$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
}