我正在写一个电报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';
}
chat id是一个整数var,我从用户个人资料中获取并检查它是否存在于数据库中;但无论如何,它总是将user_status设置为“new'即使该聊天ID已存在于数据库中。
我们也在数据库中存储了用户名(这是字符串)所以我用用户名启动了这个SQL SELECT,它起作用了!
问题是什么?
更新:我刚刚尝试过“mysqli'不幸的是,我得到了相同的结果。
答案 0 :(得分:1)
对于大多数数据库,PDOStatement :: rowCount()不返回 受SELECT语句影响的行数。相反,使用 PDO :: query()发出带有相同的SELECT COUNT(*)语句 将谓词作为预期的SELECT语句,然后使用 PDOStatement :: fetchColumn()来检索将要的行数 被退回然后,您的应用程序可以执行正确的操作。
如果您想了解更多
,请查看此link*如果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';
}
答案 1 :(得分:1)
rowCount()返回受相应PDOStatement对象执行的最后一个DELETE,INSERT或UPDATE语句影响的行数。
所以rowCount()用select语句真的不可靠,我建议你做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';
}
答案 2 :(得分:0)
删除你身份的引号和点
$check_user = $con->query("SELECT * FROM Users WHERE chat_id='$chat_id'");