在null上调用成员函数prepare()

时间:2017-08-04 10:33:56

标签: php pdo

我想创建一个函数来检查用户是否已经存在于db中。该函数存储在名为checks.php的php文件中,并且必须返回一个值。

require 'database.php';
function exist_user( $username){
 $sth = $conn->prepare('SELECT email FROM users WHERE email = :$username');       
 $sth->bindParam(':email', $username);
 $sth->execute();
 return ($sth->rowCount() == 0) ?  true :  false;
}

我的database.php文件:

$server = 'localhost';
$username = 'root';
$password = '';
$database = 'auth';
try {
  $conn = new PDO("mysql:host=$server;dbname=$database;", $username, 
  $password);
} catch (PDOException $e) {
  die( "Connection failed: " . $e->getMessage());
}

我在名为exist_user()的另一个php文件中调用register.php

require 'database.php';
require 'checks.php';

if (!exist_user($username)) {
  //insert in the db
else{
  //echo some message error 
}

该错误引发了这句话: $ sth = $ conn-> prepare('SELECT email FROM users WHERE email =:$ username');

我已尝试过checks.php文件:

  1. database.php to checks.php
  2. 移动代码
  3. 在php标记
  4. 之后设置error_reporting(E_ALL); ini_set('display_errors', 1);
  5. 我在这类错误中看到了不同的答案,但没有人帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

你有一些错误。

首先:<{em> $connuser_exist函数的scope内不存在;您需要将其作为参数传递或使用global关键字进行访问。

function exist_user($conn, $username){
    $sth = $conn->prepare('SELECT email FROM users WHERE email = :$username');       
    ...
}

......或......

function exist_user($username){
    global $conn;
    $sth = $conn->prepare('SELECT email FROM users WHERE email = :$username');       
    ...
}

其次:你的参数绑定有点破碎:

$sth = $conn->prepare('SELECT email FROM users WHERE email = :$username');       
$sth->bindParam(':email', $username);

那将试图从字面上绑定一个名为$username的参数 - 你可能只想要:username

然后你绑定的参数不是:email而是:username - 即。

$sth = $conn->prepare('SELECT email FROM users WHERE email = :username');       
$sth->bindParam(':username', $username);

最后: - 您可能使用return ($sth->rowCount() == 0) ? true : false;来返回成功状态但技术上rowCount()会返回的数量受影响的行,未检索到:

  

PDOStatement :: rowCount()返回受相应PDOStatement对象执行的最后一个DELETE,INSERT或UPDATE语句影响的行数。

     

如果关联的PDOStatement执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。但是,并不保证所有数据库都有这种行为,不应依赖于便携式应用程序。

然而如果您只是需要确定用户是否存在,您可以使用以下内容:

function exist_user($conn, $username) {
    $sth = $conn->prepare('SELECT 1 AS user_exists FROM users WHERE email = :username');        
    $sth->bindParam(':username', $username);

    if($sth->execute()) {
        $result = $stc->fetch(PDO::FETCH_ASSOC);
        return !empty($result['user_exists']);
    }
    else {
        return false;
    }
}

答案 1 :(得分:0)

$conn对象是函数作用域中不存在的全局对象,全局对象既可以作为parameter / argument传递给函数,也可以通过使用关键字global

function exist_user($username, $conn){
  $sth = $conn->prepare('SELECT email FROM users WHERE email = :$username');       
  $sth->bindParam(':email', $username);
  $sth->execute();
  return ($sth->rowCount() == 0) ?  true :  false;
}  

或者:

function exist_user($username){
  global $conn;
  $sth = $conn->prepare('SELECT email FROM users WHERE email = :$username');       
  $sth->bindParam(':email', $username);
  $sth->execute();
  return ($sth->rowCount() == 0) ?  true :  false;
}

我建议使用选项1,它更容易阅读,global关键字是令人厌恶的(个人意见)。