致命错误:调用字符串上的成员函数 prepare()

Posted

技术标签:

【中文标题】致命错误:调用字符串上的成员函数 prepare()【英文标题】:Fatal error: Call to a member function prepare() on string 【发布时间】:2019-02-11 04:23:35 【问题描述】:

请稍等,不要将此作为重复发布,因为我已完成研究并尝试了所有方法但无法使其正常工作,我不断收到此错误“致命错误:调用 C:\wamp64 中字符串上的成员函数 prepare() \www\Etego\dbcontroller.php 在第 63 行“我试图让我的题词表格上的人不要两次使用相同的电子邮件,在此先感谢!这是代码:

dbcontroller.php

<?php
class DBController 
    public $host = "localhost";
    public $user = "root";
    public $password = "";
    public $database = "members";
    public $conn;

    function __construct() 
        $this->conn = $this->connectDB();
    

    function connectDB() 
        $conn = mysqli_connect($this->host,$this->user,$this->password,$this->database);
        return $conn;
    

    function runQuery($query) 
        $result = mysqli_query($this->conn,$query);
        while($row=mysqli_fetch_assoc($result)) 
            $resultset[] = $row;
                
        if(!empty($resultset))
            return $resultset;
    

    function numRows($query) 
        $result  = mysqli_query($this->conn,$query);
        $rowcount = mysqli_num_rows($result);
        return $rowcount;    
    

    function updateQuery($query) 
        $result = mysqli_query($this->conn,$query);
        if (!$result) 
            die('Invalid query1: ' . mysqli_error($this->conn));
         else 
            return $result;
        
    

    function insertQuery($query) 
        $result = mysqli_query($this->conn,$query);
        if (!$result) 
            die('Invalid query2: ' . mysqli_error($this->conn));
         else 
            return $result;
        
    

    function deleteQuery($query) 
        $result = mysqli_query($this->conn,$query);
        if (!$result) 
            die('Invalid query3: ' . mysqli_error($this->conn));
         else 
            return $result;
        
    



/* Email already exists */
/*line 63*/       
$db = new DBController; 
$db->database->prepare("SELECT * FROM members WHERE email = ?");
$reqemail->execute(array($email));
$emailexist = $reqemail->rowCount();
if($emailexist == 0) 
 else 
    $error_message = "Email already exists";

//end of email existance
?> 

index2.php

<!-- how to make members when login "keep me signed in"  and ho to make users 13+ with the date input -->

<?php
if(!empty($_POST["register-user"])) 
    /* Form Required Field Validation */
    foreach($_POST as $key=>$value) 
        if(empty($_POST[$key])) 
        $error_message = "All Fields are required";
        break;
        
    
    /* Password Matching Validation */
    if($_POST['password'] != $_POST['confirm_password']) 
    $error_message = 'Passwords should be same<br>'; 
    

    /* Email Validation */
    if(!isset($error_message)) 
        if (!filter_var($_POST["userEmail"], FILTER_VALIDATE_EMAIL)) 
        $error_message = "Invalid Email Address";
        
    

    /* Validation to check if gender is selected */
    if(!isset($error_message)) 
    if(!isset($_POST["gender"])) 
    $error_message = " All Fields are required";
    
    

    /* Validation to check if Terms and Conditions are accepted */
    if(!isset($error_message)) 
        if(!isset($_POST["terms"])) 
        $error_message = "Accept Terms and Conditions to Register";
        
    





    if(!isset($error_message)) 
        require_once("dbcontroller.php");
        $db_handle = new DBController();
        $query = "INSERT INTO members (username, firstname, lastname, password, email, gender, dob) VALUES
        ('" . $_POST["userName"] . "', '" . $_POST["firstName"] . "', '" . $_POST["lastName"] . "', '" . md5($_POST["password"]) . "', '" . $_POST["userEmail"] . "', '" . $_POST["gender"] . "' , '" . $_POST["dob"] . "' )";
        $result = $db_handle->insertQuery($query);
        if(!empty($result)) 
            $error_message = "";
            $success_message = "You have registered successfully!";    
            unset($_POST);
         else 
            $error_message = "Problem in registration. Try Again!";    
        
    

?>
<html>

<?php 


    include 'C:\wamp64\www\Etego\stylesignup.css';


    ?>


<head>
<title>https://Etego/signup.com</title>
</head>
<body>
<form name="frmRegistration" method="post" action="">
<table border="0"  align="center" class="demo-table">
<?php if(!empty($success_message))  ?>    
<div class="success-message"><?php if(isset($success_message)) echo $success_message; ?></div>
<?php  ?>
<?php if(!empty($error_message))  ?>    
<div class="error-message"><?php if(isset($error_message)) echo $error_message; ?></div>
<?php  ?>
<tr>
<td>User Name</td>
<td><input type="text" class="demoInputBox allinsc" name="userName" value="<?php if(isset($_POST['userName'])) echo $_POST['userName']; ?>"></td>
</tr>
<tr>
<td>First Name</td>
<td><input type="text" class="demoInputBox allinsc" name="firstName" value="<?php if(isset($_POST['firstName'])) echo $_POST['firstName']; ?>"></td>
</tr>
<tr>
<td>Last Name</td>
<td><input type="text" class="demoInputBox allinsc" name="lastName" value="<?php if(isset($_POST['lastName'])) echo $_POST['lastName']; ?>"></td>
</tr>
<tr>
<td>Password</td>
<td><input type="password" class="demoInputBox allinsc" name="password" value=""></td>
</tr>
<tr>
<td>Confirm Password</td>
<td><input type="password" class="demoInputBox allinsc" name="confirm_password" value=""></td>
</tr>
<tr>
<td>Email</td>
<td><input type="text" class="demoInputBox allinsc" name="userEmail" value="<?php if(isset($_POST['userEmail'])) echo $_POST['userEmail']; ?>"></td>
</tr>
        <tr>
<td>Date Of birth</td>
<td><input type="date" value="<?php print(date("YYYY-MM-DD"))?>" class="demoInputBox" name="dob" value="<?php if(isset($_POST['dob'])) echo $_POST['dob']; ?>"></td>
</tr>
<tr>
<td>Gender</td>
<td><input type="radio" name="gender" value="Male" <?php if(isset($_POST['gender']) && $_POST['gender']=="Male")  ?>checked<?php   ?>> Male
<input type="radio" name="gender" value="Female" <?php if(isset($_POST['gender']) && $_POST['gender']=="Female")  ?>checked<?php   ?>> Female
    <input type="radio" name="gender" value="not specified" <?php if(isset($_POST['gender']) && $_POST['gender']=="not specified")  ?>checked<?php   ?>> not specified
</td>
</tr>
<tr>
<td colspan=2>
<input type="checkbox" name="terms"> I accept <a href="terms.html">Terms and Conditions</a> <input type="submit" name="register-user" value="Register" class="btnRegister"></td>
</tr>

</table>
</form>

<div class="header1"></div>
    <div class="hdetail1"></div>

    <h class="etegotxt1">Etego</h>

    <img src="Etego_Logo.png"    class="logo1">

</body></html>

【问题讨论】:

所以,$db-&gt;database 是一个字符串! (设置为成员)尝试改为$db-&gt;prepare(...) @PaulT。致命错误:调用未定义的方法 DBController::prepare() 您的情况与我的预期有些不同,然后尝试:$db-&gt;conn-&gt;prepare(...) 看起来@sazzadur 已经回答了。 知道如何将它转移到我的 index2.php 而不是 dbcontroller 上,因为我所有其他 error_messages 都在 index2 上 当您将您的站点专门移动到一个可以正常工作的 unix 服务器时,您不想像这样包含include 'C:\wamp64\www\Etego\stylesignup.css';。使用相对路径 【参考方案1】:

这里有很多问题:

您正在尝试准备使用$db-&gt;database-&gt;prepare() 的语句,如果您查看您的类database 它是一个包含字符串memberspublic $database = "members"; 的字符串这解释了错误正在报告中

您似乎也混淆了mysqli_ API 和PDO API,并且正在使用一些 PDO API 函数,它们永远不会工作,它们是完全不同的野兽

所以也改一下

/* Email already exists */
/*line 63*/       
$db = new DBController; 
$db->database->prepare("SELECT * FROM members WHERE email = ?");
$reqemail->execute(array($email));
$emailexist = $reqemail->rowCount();
if($emailexist == 0) 
 else 
    $error_message = "Email already exists";

/* Email already exists */
/*line 63*/       
$db = new DBController; 
$stmt = $db->conn->prepare("SELECT * FROM members WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();

$result = $stmt->get_result();

if($result->num_rows > 0) 
    $error_message = "Email already exists";

您将使用连接对象来准备查询和所有mysqli_ API 函数、方法和属性。

更新:仍在创建重复帐户

在我看来,您的 dup 帐户检查在错误的位置,应该移到 index2.php 中。

或者在此行之后添加针对$error_message 的测试,因为您忘记测试 Dup 电子邮件检查是否产生错误。

if(!isset($error_message)) 
    require_once("dbcontroller.php");
    if ( !isset($error_message) ) 

我的强烈建议是在 index2 中检查 Dup 电子邮件并将其从 dbconnect.php 中删除,因为它并不真正属于 dbconnect.php,因为每次您想在任何脚本中连接到数据库时都会不必要地运行它!

【讨论】:

确实是完全不同的野兽。这让我大吃一惊,让我颤抖吧。 一切似乎都很好,但我仍然可以为不同的帐户使用相同的电子邮件,它说注册不正确。 嗯,这取决于你在这段代码之后做什么,以及你没有向我们展示的代码。所以我建议你再问一个关于这个的问题 @RiggsFolly 我向您展示了我拥有的所有代码,而且我不得不等待 2 天才能提出另一个问题,所以如果您现在可以这样做,我会喜欢吗?当然,只有你愿意。 给你,修复建议【参考方案2】:

问题是你的$database 变量是一个没有prepare() 函数的字符串。相反,您可能希望使用保持有效数据库连接的 $conn 变量。

要做到这一点,改变

$db->database->prepare("SELECT * FROM members WHERE email = ?");

$stmt = $db->conn->prepare("SELECT * FROM members WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();

这里是 PHP official documentation。

【讨论】:

以上是关于致命错误:调用字符串上的成员函数 prepare()的主要内容,如果未能解决你的问题,请参考以下文章

PHP“致命错误:未捕获错误:调用成员函数prepare()为null”

PDO 致命错误:在非对象上调用成员函数 prepare()

PHP 致命错误:在第 45 行的 admin\includes\html\database.class.php 中的非对象上调用成员函数 prepare()

致命错误:未捕获的错误:调用 bool 上的成员函数 execute() [重复]

致命错误:对 SQL SERVER 2012 的非对象 XAMPP 上的成员函数 query() 调用

致命错误:当内存使用率非常高时,调用非对象上的成员函数 write()