php中的mysql查询具有来自两个表的更多条件

时间:2015-07-25 14:07:30

标签: php mysql

首先,我是PHP和SQL的绝对初学者。 我有两个表:users(userID, fullname, username, email, pass, userlevel)games(gameID, userID, club, result, created_time)。 在表games中,我有userID,与表users中的相同,但它不是外键。当我在MySQL中执行此查询时,它可以正常工作:

DELETE FROM games 
WHERE EXISTS 
(SELECT * FROM users 
WHERE userlevel=2 
AND users.userID=games.userID)

删除users.userIDgames.userID匹配的任何内容,如果该用户为userlevel 2

我需要在PHP中使用它,但唯一的区别是userID将匹配记录的用户ID,并且用户将只能删除使用其userID输入的数据。< / p>

此外,如果允许userlevel 1的其他所有人都能够删除桌面游戏中的所有内容,无论是谁输入相同的提交内容?

我有这个,但它没有用......它一直给我带来同样的错误:

  

致命错误:在非对象中调用成员函数bind_param()   C(...)

require ('db_con.php');     
session_start(); 
$userID=$_SESSION["UserID"];

if (isset($_POST['delete'])){                       
        $stmt=$con->prepare("DELETE FROM games WHERE  EXISTS (SELECT FROM users AS u WHERE u.userID = ? AND u.userlevel = 2 "));        

       $stmt->bind_param("s",$_POST['userID']));
       $stmt->execute();
}

即使我在查询$userlevel=2中添加u.userlevel = '$userlevel'并替换,也会出现同样的错误......

任何建议都将不胜感激。 感谢名单!

3 个答案:

答案 0 :(得分:0)

userID是一个整数值。将bind_param行更改为

$stmt->bind_param('i', $user_id);

prepare()失败的一个原因是 -

if the sql statement sent to it is not valid in the current DB. prepare() will then return false

例如 - 如果表名不正确或查询中的一个或多个字段不存在

答案 1 :(得分:0)

你的括号不匹配:

    $stmt=$con->prepare("DELETE FROM games WHERE  EXISTS (SELECT FROM users AS u WHERE u.userID = ? AND u.userlevel = 2 "));        

应该是

$stmt=$con->prepare("DELETE FROM games WHERE EXISTS (SELECT * FROM users AS u WHERE u.userID = ? AND u.userlevel = 2 )");

无论如何,您收到的错误意味着$con->prepare没有返回对象。很可能它返回false。我假设你正在使用PDO,所以根据文档:

  

如果数据库服务器无法成功准备语句,PDO :: prepare()将返回FALSE或发出PDOException(取决于错误处理)。

就是这样的情况。您的MySQL服务器无法绑定该语句。为了更好地调试(例如,请参阅更多有用的错误消息),请将PDO设置为在错误上抛出异常。

你可能会这样做:

$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

只需在连接数据库后立即添加该行。

答案 2 :(得分:0)

我发现了错误,这里是wright代码:

$ stmt = $ con&gt; prepare(“DELETE FROM games WHERE EXISTS(SELECT * FROM users WHERE users.userID =?AND users.userlevel = 2)”);

但它不能正常工作,它从我的游戏桌中删除了所有内容:D 我想,SELECT * FROM必须具体!