我是PHP新手,因此请和我一起裸露。我到处搜索这个问题的解决方案,但没有对它进行排序。在堆栈中有几个类似的问题,但我很困惑我是否正确实施解决方案,这是另一个问题,或者如果我错了。我想知道是否有任何有关问题的见解。我需要从另一个类访问数据库,但我得到错误致命错误:调用第40行上的demo.php中的非对象的成员函数prepare()。这里是我的db_connect.php用class来包装数据库访问的问题PHP GAE
<?php
class DbConnect {
function __construct() {
}
/**
* Establishing database connection
* @return database connection handler
*/
function connect() {
$db = null;
if (isset($_SERVER['SERVER_SOFTWARE']) &&
strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine') !== false) {
// Connect from App Engine.
try{
$db = new pdo('mysql:unix_socket=/cloudsql/projectid:instance;dbname=guestbook', 'root', 'password');
}catch(PDOException $ex) {
die('Unable to connect.');
}
}
$db = null;
}
}
?>
这里就是错误是从demo.php
<?php
class Demo {
private $conn;
function __construct() {
require_once dirname(__FILE__) . '/include/db_connect.php';
// opening db connection
$db = new DbConnect();
$this->conn = $db->connect();
}
public function getAllChatRooms() {
$stmt = $this->conn->prepare("SELECT * FROM chat_rooms");
$stmt->execute();
$tasks = $stmt->get_result();
$stmt->close();
return $tasks;
}
public function getAllUsers() {
$stmt = $this->conn->prepare("SELECT * FROM users");
$stmt->execute();
$tasks = $stmt->get_result();
$stmt->close();
return $tasks;
}
public function getDemoUser() {
$name = 'Joe Bloggs';
$email = '[email protected]';
*Error
40 ->* $stmt = $this->conn->prepare("SELECT user_id from users WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$stmt->store_result();
$num_rows = $stmt->num_rows;
if ($num_rows > 0) {
$stmt->bind_result($user_id);
$stmt->fetch();
return $user_id;
} else {
$stmt = $this->conn->prepare("INSERT INTO users(name, email) values(?, ?)");
$stmt->bind_param("ss", $name, $email);
$result = $stmt->execute();
$user_id = $stmt->insert_id;
$stmt->close();
return $user_id;
}
}
}
?>
未来在__construct我没有获得数据库实例的功能并将其分配给$ conn?我不明白这是否正确。我围绕DBConnect进行了更改,以查看mysqli是否可以工作而不是pdo,但是这并没有解决任何问题。如果有人能够对此有所了解,我将非常感激。
编辑:
我将改述我在找什么。我想知道是否有办法将mysqli连接到带有SQL的Google App Engine,这样可以避免pdo问题。只有在连接到数据库时才会使用pdo,如果我可以将其更改为mysqli,那么我应该能够与demo.php进行通信,而无需更改pdo不支持的方法,如bind_param。正确吗?如果有一个简单的方法来更新demo.php与pdo一起工作,我同样很乐意这样做,但我不知道pdo支持哪些方法,并且我不了解整个php。从编码的角度来看,最简单的选择是什么?是否有可能在GAE中使用mysqli,还是必须是pdo?如果GAE不支持mysqli,有人可以告诉我如何去更新demo.php中的函数吗?
谢谢。
一个简单的谷歌搜索是足够地发现: 不同的连接接口工作 谷歌Cloud SQL的使用我共同的连接支持从PHP连接包括PDO_MySQL,mysqli和MySQL API。默认情况下,App Engine中,开发(本地)或生产(部署的App Engine应用程序)中启用PDO_MySQL,mysqli和MySQL API。 – peuh
关于你的编辑,检查http://php.net/manual/en/mysqli.construct.php你只需要改变你的连接方法的代码,这样,而不是使用它使用MySQL的PDO ... – peuh
我打上你的答案正确的,谢谢 –