这是我第一次将PDO用于测试目的.但是发生了一个奇怪的错误,谷歌搜索它,似乎很奇怪.
这是我的数据库测试类
class db extends PDO
{
# Our instance.
private static $db = NULL;
# Calling the connector.
public static function connect()
{
if (self::$db === NULL)
{
$class = __CLASS__;
self::$db = new $class();
}
return self::$db;
}
# Connector.
public function __construct()
{
$dns = 'mysql:dbname='.reg::get('db-name').';host='.reg::get('db-host');
self::$db = new PDO($dns, reg::get('db-username'), reg::get('db-password'));
reg::delete('db-password');
}
# Quick reporting
public function reportError($array)
{
if ($this->db != NULL) { echo 'Myself getting horny'; } // Just for testing, i'm not getting horny because of a mysql database connection!
}
}
Run Code Online (Sandbox Code Playgroud)
然后执行以下代码:
$db = new db();
$row = $db->prepare('SELECT * FROM test WHERE id = :id')->execute(array('id' => 1));
echo $row['value'];
Run Code Online (Sandbox Code Playgroud)
它向我显示以下错误:
Warning: PDO::prepare() [pdo.prepare]: SQLSTATE[00000]: No error: PDO constructor was not called in myfile.php on line 39
Run Code Online (Sandbox Code Playgroud)
将第39行视为
$row = $db->prepare('SELECT * FROM test WHERE id = :id')->execute(array('id' => 1));
Run Code Online (Sandbox Code Playgroud)
你的代码是一团糟,可能是因为你是如此的角质......
connect() 方法 - 它为什么存在?:
if ($db === NULL)
Run Code Online (Sandbox Code Playgroud)
应该:
if (self::$db === NULL)
Run Code Online (Sandbox Code Playgroud)
self::$db = new $class();
Run Code Online (Sandbox Code Playgroud)
所以,如果$class == __CLASS__ == db,你在做self::$db = new db();,似乎不对.
您不能使用PDO来准备标识符,例如表格或列.
$db->prepare('SELECT * FROM :table WHERE id = :id')->execute(array('table' => 'test', 'id' => 1));
Run Code Online (Sandbox Code Playgroud)
应该:
$db->prepare('SELECT * FROM `test` WHERE id = :id')->execute(array('id' => 1));
Run Code Online (Sandbox Code Playgroud)
试试这个:
class db extends PDO
{
private static $db = null;
public static function singleton()
{
if (is_null(self::$db) === true)
{
self::$db = new PDO('mysql:dbname='.reg::get('db-name').';host='.reg::get('db-host'), reg::get('db-username'), reg::get('db-password'));
}
return self::$db;
}
}
Run Code Online (Sandbox Code Playgroud)
像这样:
$result = db::singleton()->prepare('SELECT * FROM `test` WHERE id = :id')->execute(array('id' => 1));
var_dump($result);
Run Code Online (Sandbox Code Playgroud)