未捕获错误:在null上调用成员函数query()

时间:2017-09-28 20:33:34

标签: php mysql prepared-statement sql-insert

我在下面的代码中被困了几个小时。我不知道如何解决这个错误。

  

注意:未定义的变量:第19行的D:\ xampp \ htdocs \ recon \ register.php中的mysqli

     

致命错误:未捕获错误:在D:\ xampp \ htdocs \ recon \ register.php中调用null上的成员函数query():19堆栈跟踪:在D:\ xampp \ htdocs中抛出#0 {main}第19行\ recon \ _register.php

<?php

$conn = new mysqli('localhost', 'root', '', 'user');

if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$uname = $_POST['uname'];
$psw = $_POST['psw'];
$options = [
'cost' => 12,];
$hashedpassword= password_hash($psw, PASSWORD_BCRYPT, $options);

$result = $mysqli->query("SELECT username FROM registration WHERE username = '$uname'"); 
$row_count = $result->num_rows; 
if($row_count == 1) { 
    echo 'User already exists, try another one.'; } 
else {

    $query = "INSERT INTO user (username, password) VALUES(?, ?)";
    $statement = $mysqli->prepare($query);

    $statement->bind_param('ss', $uname, $hashedpassword);

    if($statement->execute())
    {
         print 'Success! Last inserted record : ' .$statement->insert_id .'<br />'; 
    }
    else
    {
         die('Error : ('. $mysqli->errno .') '. $mysqli->error);
    }
    $statement->close();

}

?>

2 个答案:

答案 0 :(得分:2)

您正在声明名为mysqli的{​​{1}}实例。这表示您与DB的连接。您应该在变量$conn而不是(未定义)变量$conn上调用方法。所以即。你的第19行应该是:

$mysqli

另外,为防止在您的查询/网页上使用SQL-Injection,您应该使用prepared statements无处不在(包括$result = $conn->query("SELECT username FROM registration WHERE username = '$uname'") )。

答案 1 :(得分:0)

如果拼写错误构造函数,则会出现此错误。 例如,php中构造函数的正确语法,

__construct(){}

你可能写错了,

__contruct(){}

同样,检查其他功能。