Неустранимая ошибка: вызов функции-члена prepare () для строки - PullRequest
0 голосов
/ 06 сентября 2018

подождите, пожалуйста, не публикуйте это как дубликат, потому что я провел исследование и попробовал все, но не могу заставить его работать, я продолжаю получать эту ошибку "Неустранимая ошибка: вызов функции-члена prepare () для строки в C: \ wamp64 \ www \ Etego \ dbcontroller.php on line 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" width="500" 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" alt="Etego logo" width="50" height="50" class="logo1">

</body></html>

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Здесь есть ряд проблем:

Когда вы пытаетесь подготовить оператор, который вы используете $db->database->prepare(), и если вы посмотрите на свой класс database, это строка, содержащая строку members, то есть public $database = "members"; , которая объясняет ошибку что сообщается

Вы также, кажется, перепутали API mysqli_ и API PDO и используете некоторые функции API PDO, , которые никогда не будут работать, они совершенно разные звери .

Так что также измените это

/* 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-функции, методы и свойства.

ОБНОВЛЕНИЕ: Все еще создаются двойные учетные записи

По моему мнению, ваш дуп аккаунт находится не в том месте и должен быть перенесен в index2.php.

Или после этой строки добавьте тест против $error_message, потому что вы забыли проверить, не вызвала ли ошибка при проверке электронной почты.

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

Мое настойчивое предложение было бы сделать проверку Dup Email в index2 и удалить ее из dbconnect.php, поскольку она на самом деле не принадлежит dbconnect.php, так как она будет запускаться без необходимости каждый раз, когда вы хотите подключиться к базе данных в любом скрипте !

0 голосов
/ 06 сентября 2018

Дело в том, что ваша $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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...