首先,我是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.userID
与games.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'
并替换,也会出现同样的错误......
任何建议都将不胜感激。 感谢名单!
答案 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必须具体!