我是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
我打上你的答案正確的,謝謝 –