我有一个PHP登录脚本。这是此人可以创建新用户的部分。我的问题是我想检查用户是否存在,以及表中是否存在用户名,而不是创建新用户。但是,如果用户确实存在,我希望它在会话变量中返回错误。这是我现在的代码。这不包括我的数据库连接,但我知道它们确实有效。它的num_rows()
被写为error_log文件中的错误。这是代码:
$username = mysql_real_escape_string($username);
$query = "SELECT * FROM users WHERE username = '$username';";
$result = mysql_query($query,$conn);
if(mysql_num_rows($result)>0) //user exists
{
header('Location: index.php');
$_SESSION['reg_error']='User already exists';
die();
}
else
{
$query = "INSERT INTO users ( username, password, salt )
VALUES ( '$username' , '$hash' , '$salt' );";
mysql_query($query);
mysql_close();
header('Location: index.php');
它给我的错误是
mysql_num_rows(): supplied argument is not a valid MySQL result resource in [dirctory name]
答案 0 :(得分:1)
从结果集中检索行数。 此命令仅对SELECT或SHOW等返回实际结果集的语句有效。要检索受INSERT,UPDATE,REPLACE或DELETE查询影响的行数,请使用mysql_affected_rows()。
而不是执行SELECT *
然后执行mysql_num_rows(),您可以执行SELECT COUNT(*)
,然后通过获取字段(应该为0或1)来检索行数。 SELECT COUNT将始终返回结果(假设查询语法当然是正确的。)
另外,更改查询:
$query = "SELECT * FROM users WHERE username = '$username';";
进入
$query = "SELECT * FROM users WHERE username = '"
. mysql_real_escape_string($username) . "';";
答案 1 :(得分:0)
出于好奇,你有没有听说过upserts? I.E.,“插入重复密钥”。在这种情况下,它们对您很有用,至少如果您的用户名列是唯一键。
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
答案 2 :(得分:0)
$username = mysql_real_escape_string($username);
我认为您必须将上述内容替换为
$username = mysql_real_escape_string($_POST[$username]);