2016-03-14 140 views
1

我有一个用户注册页面。除了检查用户名已被其他用户使用的情况以外,所有内容都在页面上工作。我的PHP(“...”意味着存在之间是不相关的其他代码):mysqli_num_rows没有返回预期的结果

$login = mysqli_connect("localhost","***","***","***"); // hidden for obvious reasons 

function usernameTaken($name) 
{ 
    $query = "SELECT * FROM useraccs WHERE username='$name' LIMIT 1"; 

    return mysqli_num_rows(mysqli_query($login,$query)) > 0; 
} 

... 

$username = mysqli_real_escape_string($login,$_POST["username"]); 

.... 

if (usernameTaken($username)) 
    $error.= "Username is already in use.<br />"; 

这是行不通的,即使我把一个字符串中,我知道是在查询字面我的SQL表。在我的HTML我有这样的:

<?php 
$query = "SELECT * FROM useraccs WHERE username='$username' LIMIT 1"; 

if (mysqli_num_rows(mysqli_query($login,$query)) > 0) 
    $error.= "Username is already in use.<br />"; 

echo $error; 
?> 

当我递交登记表格,我知道一个用户名是我的SQL表,这个代码实际工作(mysqli_num_rows返回1如预期)和误差得到呼应)。尽管代码在两种情况下都应该做同样的事情,但它在函数中不起作用。无论我放入什么函数,函数总是返回false。

我使用函数的唯一原因是美学。我知道我可以使用第二个例子,它会工作,但我不能为我的生活找出为什么该功能无法正常工作。我在这个页面的其他部分使用了完全相同风格的多个其他功能(但不包括mysqli_num_rows),并且它们工作正常。

我甚至尝试从函数中的查询返回一个数组,但没有回来。我必须错过PHP函数的基本功能......

+0

是'$ login'一个全局变量? – Matt

+0

对不起,$ login是我在单独的PHP文件中的数据库连接证书。我确认这不是问题,因为它在页面的其他地方工作。 –

+1

您需要将其定义为函数内的全局变量或将其作为参数。尝试在函数的第一行添加'global $ login;'或者将登录名作为您传递的参数。 – Matt

回答

2

该变量超出了函数的范围。你可以这样做:

1 - 使用全局

$login = mysqli_connect("localhost","***","***","***"); // hidden for obvious reasons 

function usernameTaken($name) 
{ 
    global $login; 
    $query = "SELECT * FROM useraccs WHERE username='$name' LIMIT 1"; 

    return mysqli_num_rows(mysqli_query($login,$query)) > 0; 
} 

2 - 把它放在函数的参数

$login = mysqli_connect("localhost","***","***","***"); // hidden for obvious reasons 

function usernameTaken($name, $login) 
{ 
    $query = "SELECT * FROM useraccs WHERE username='$name' LIMIT 1"; 

    return mysqli_num_rows(mysqli_query($login,$query)) > 0; 
}