2017-04-14 80 views
0

我在制作一个登录脚本,它从两个表中获取数据。我明白,当语句返回FALSE AKA布尔值时发生此错误,但它为什么返回false? 我做这些工作在一定程度上致命错误:调用布尔型成员函数bind_param()

function loginall($username, $password) 
{ 
    $db_host="localhost"; 
    $db_username="root"; 
    $db_password=""; 
    $db_name="name"; 
    $con=mysqli_connect($db_host, $db_username,$db_password, $db_name); 
    $mysqli = new mysqli("$db_host","$db_username","$db_password", "$db_name"); 

    $qry = "SELECT username, password, level, active FROM businesses WHERE username=? AND password=? 
    UNION SELECT username, password, level, active FROM employees WHERE username=? AND password=?"; 
    $stmt = $mysqli->prepare($qry); 
    $stmt->bind_param("ssss", $u,$p,$uu,$pp); 
    $u = $username; 
    $p = $password; 
    $uu = $username; 
    $pp = $password; 
    $stmt->execute(); 
    $result = $stmt->get_result(); 
    while($row = $result->fetch_array(MYSQLI_ASSOC)) 
    { 
     return $row; 
    } 
} 

,直到我尝试从表中获取更多的列,甚至可以从表中试图SELECT *它的伟大工程的功能。我阅读了其他类似的问题,并找到代码来显示错误,但没有运气。谢谢!

+0

U,$ P,$ UU,或$ pp为空。回应他们看哪一个。 –

+0

同样的查询在我的系统上运行 –

+0

@SloanThrasher你能解释一下吗?该函数的工作,直到我试图从表中获得更多的列,这意味着这些变量是好的? 如果我试图回应它们,它不起作用,因为我得到了错误,我说的是错误后的白色页面,或者它只是登录我,但我需要登录时获得更多的列。 – Mar1AK

回答

0

您的函数一旦碰到循环中的第一个return语句(第一次迭代)就会结束/返回。 您将需要构建完整的数组,然后将其返回一次。

这应该做到这一点:

if(!($stmt=$mysqli->prepare($qry))){ 
    return ["Prepare failed: ".mysqli_error($mysqli)]; // what does this say? 
}elseif(!$stmt->bind_param("ssss",$u,$p,$uu,$pp)){ 
    return ["Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error]; 
}else{ 
    $u = $username; 
    $p = $password; 
    $uu = $username; 
    $pp = $password; 
    if (!$stmt->execute()){ 
     return ["Execute failed: (" . $stmt->errno . ") " . $stmt->error]; 
    }else{ 
     $result = $stmt->get_result(); 
     while($row = $result->fetch_array(MYSQLI_ASSOC)){ 
      $rows[]=$row; 
     } 
     return $rows; 
    } 
} 

尝试backticking所有列名的。 LEVEL是MySQL的KEYWORD。

+0

我认为$ stmt是错误的,按照错误 –

+0

他意味着while循环不会迭代多次,因为该函数将在第一次返回后退出,但事实并非如此,循环实际上遍历整个数组。不过,我会尝试你的建议。谢谢 – Mar1AK

+0

我有兴趣了解如何在调用'return'后让函数继续运行。那将是一个新的。 – mickmackusa

-1

试试这个也许bind_result()get_result()

你可能想知道,为什么还要使用bind_result()

这严格地归因于偏好,因为语法被认为是更可读的。

但是,应该注意bind_result()不能用于*通配符选择器。它必须包含明确的价值

在这里,在使用bind_result()这个代码,值$usernameRow, $passwordRow, ....是形成数据库tebles:根据您的错误信息,一个或多个$

..... 
... 
. 
$stmt->bind_param("ssss", $username, $password, $username, $password); 
$stmt->execute(); 
$stmt->store_result(); 
$numRows = $stmt->num_rows; 
$stmt->bind_result($usernameRow, $passwordRow, $levelRow, $activeRow); 
if($numRows > 0) { 
    while ($stmt->fetch()) { 
    $u[] = $usernameRow; 
    $p[] = $passwordRow; 
    $uu[] = $levelRow; 
    $pp[] = $activeRow; 
    } 
} 
$stmt->close(); 
+0

我也开始写这个,一开始,但OP想要一个数组返回,所以它必须重新包装。 – mickmackusa

+0

@Mousa Alfhaily 它只是在输入正确的用户名和密码时返回NULL。我将它设置为在表中找不到用户名和密码匹配时返回NULL。 – Mar1AK

+0

@ Mar1AK对不起,我编辑了答案,我做了一个错误,'bind_param'应该是用户输入的用户名和密码,它们是'$ username,$ password',但对于这两个表,所以'bind_param(“ssss “,$ username,$ password,$ username,$ password)'' –

相关问题