当前位置: 首页 > 知识库问答 >
问题:

在空值上调用成员函数 prepare()

公西运良
2023-03-14

我想创建一个函数来检查数据库中是否已存在用户。该函数存储在名为 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;
}

我的数据库.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());
}

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

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

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

错误出现在这个句子上:$sth=$con-

我在< code>checks.php文件中试过:

    < li >将代码从< code>database.php移动到checks.php < li >设置< code >错误报告(E _ ALL);ini_set('display_errors ',1);在php标记之后 < li >我看到了关于此类错误的不同答案,但没有一个能帮我解决这个问题。

共有2个答案

陶锋
2023-03-14

$conn对象是一个不存在于函数作用域中的全局对象,全局对象可以作为参数/自变量或通过使用关键字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,它更容易阅读,并且全球关键字令人憎恶(个人意见)。

段干靖
2023-03-14

你有几个错误。

首先:$connuser_exist函数的范围内不存在;您需要将其作为参数传入,或使用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

然后,您绑定的参数不是< code>:email,而是< code>:username,即

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

最后: - 您可能会侥幸使用返回 ($sth-

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

如果关联的PDO语句执行的最后一个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;
    }
}

 类似资料:
  • 我想基本验证,如果用户是管理员,然后请求下一步,否则重定向到主页 User.php: 最后一个函数是 一个dmin.php(这是中间件): routes.php: 我得到以下错误: Admin.php第21行中的FatalErrorException: 调用null上的成员函数isAdmin() 我还添加了

  • 函数attach()有问题。我已经创建了3个表。1表用于添加电影。表2适用于电影类别。3表是电影ID和类别ID的集合。多对多的组合。 当我想添加一个新的视频类别从表格这我有错误- 视频控制器。php- 视频php模型 类别php模型 User.php模型(也许你需要一个User.php模型解决问题) 迁移-创建\u类别\u视频\u表。php 迁移-创建类别表。php 移民-create_video

  • 问题内容: 此代码 出现错误 : 致命错误:在第42行的C:\ Users \ fel \ VertrigoServ \ www \ login \ validation.php中的非对象上调用成员函数prepare() 码: 可能的原因是什么? 另一个问题 是什么?抱歉,我是pdo的新手 问题答案: 未定义。您没有在函数内部声明它,也没有将其作为参数传递。 您需要将其传递(好),或在全局名称空间

  • 问题内容: 我正在尝试在此准备好的语句中绑定变量,但我一直收到错误: 调用该函数,并将变量传递给它。当我更改函数以仅回显变量时,该变量会在页面上正常打印,但是如果我尝试在此处绑定它,则会收到错误。有人可以帮忙吗? 我知道函数没有完全写在这里,但这不应该是一个问题。我不明白为什么我会收到此错误。 问题答案: 正如错误消息所说,这似乎不是一个对象。尝试在您的prepare- call之后使用来调试它。

  • 我使用Laravel 8与Livewire。 我创建了这个来显示项目列表,用户也可以应用过滤器。在加载数据时,每页显示10条记录。然而,当我尝试单击下一页或特定的页码时,我得到错误调用成员函数链接()数组... 我也在使用存储库,它被注入了livewire组件。

  • 最近在review代码的时候发现,使用了空指针调用成员函数,并且成员函数内部有使用到成员变量,居然没有出错。很是奇怪,就用一篇博客把关于空指针调用成员函数相关的内容总结起来。 空指针调用成员函数 调用普通成员函数 如果空指针调用普通成员函数,看该函数体中是否使用到了this指针(是否访问非静态成员变量)。如果使用到了this指针,程序会崩溃;如果没有使用到this指针,程序不会崩溃。当然,如果访问