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