我正在写一个电报php机器人,我在sql select语句上遇到了这个问题,它不起作用。
这是脚本:
$chat_id = $update->message->chat->id;
$check_user = $con->query("SELECT * FROM Users WHERE chat_id='".$chat_id."'");
if($check_user->rowCount() > 0){
$user_data = $check_user->fetchAll();
$user_status = 'active user';
}else{
$user_status = 'new';
}
聊天ID是一个整数var,我从用户配置文件中获取并检查它是否存在于数据库中;但无论如何,它总是将user_status设置为"new",即使该聊天ID已经存在于数据库中。
我们也将用户名存储在数据库中(这是字符串),所以我用用户名启动了这个非常 SQL SELECT,它起作用了!
怎么了?
更新:我刚刚尝试了"mysqli",不幸的是我得到了相同的结果。
rowCount() 返回受相应 PDOStatement 对象执行的最后一个 DELETE、INSERT 或 UPDATE 语句影响的行数。
所以rowCount()对于select语句来说并不可靠,我建议你做你的选择,然后使用PDOStatement::fetchAll,它将返回包含所有结果集行的数组,然后计算数组如果它大于零设置你的状态。
<?php
$chat_id = $update->message->chat->id;
$check_user = $con->prepare("SELECT * FROM Users WHERE chat_id = ? ");
$check_user->execute([$chat_id]);
$user_data = $check_user->fetchAll();
if (count($user_data) > 0) {
$user_status = 'active user';
}else{
$user_status = 'new';
}
对于大多数数据库,PDOStatement::rowCount() 不返回 受 SELECT 语句影响的行数。相反,请使用 PDO::query() 发出具有相同 谓词作为预期的 SELECT 语句,然后使用 PDOStatement::fetchColumn() 检索将 被退回。然后,应用程序可以执行正确的操作。
如果您想了解更多信息,请查看此链接
*如果chat_id是整数,则应从查询中删除单引号
$chat_id = $update->message->chat->id;
$check_user = $con->query("SELECT * FROM Users WHERE chat_id = $chat_id");
if($check_user->fetchColumn() > 0){
$user_data = $check_user->fetchAll();
$user_status = 'active user';
}else{
$user_status = 'new';
}
删除 id 上的引号和点
$check_user = $con->query("SELECT * FROM Users WHERE chat_id='$chat_id'");