ОБНОВЛЕНО: Изменен код для текущего кода рабочего класса с использованием PDO вместо устаревших методов
На исходный вопрос был дан ответ, и проблема решена. Фил вырос с использованием PDO вместо традиционного SQL, поэтому, когда этот класс находится в зачаточном состоянии, я решил начать процесс миграции.
class db { private static $connection; const __DB__HOST__ = __DB__HOST__; const __DB_USERNAME__ = __DB_USERNAME__; const __DB_PASSWORD__ = __DB_PASSWORD__; const __DB_NAME__ = __DB_NAME__; private static function getConnection() { if (self::$connection === null) { $dsn = sprintf("mysql:dbname=".__DB_NAME__.";host=".__DB_HOST__, __DB_USERNAME__, __DB_PASSWORD__,"charset=utf8" ); self::$connection = new PDO($dsn, self::__DB_USERNAME__, self::__DB_PASSWORD__, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC )); } return self::$connection; } //Make the query private static function dbQuery($sql_string) { $conn = self::getConnection(); $sth = $conn->prepare($sql_string); $sth->execute(); return $sth; } //Return all results from sqlquery in array public static function dbDataArray($sql_string){ $data = self::dbQuery($sql_string)->fetchAll(); return $data; } public static function Value($sql_string){ $data = self::dbQuery($sql_string)->fetchColumn(); return $data; } }
Это прогресс класса до сих пор, и он, похоже, отлично работает. Особая благодарность Филу за поддержку.
Любые другие рекомендации приветствуются и будут высоко оценены.
Еще раз спасибо.
В основном я пытаюсь создать класс доступа db, который я могу использовать со следующим синтаксисом
$test = db::dbDataArray("SELECT * FROM fw_settings");
Класс создаст соединение, если его нет, поэтому я могу просто вызвать методы из класса в любое время, не создавая новый экземпляр.
Вот что я имею до сих пор для структуры с одной функцией. Как только я получу класс статуса для работы над одним элементом запроса, я добавлю все остальные функции.
class db { public $connection; const __DB__HOST__ = __DB__HOST__; const __DB_USERNAME__ = __DB_USERNAME__; const __DB_PASSWORD__ = __DB_PASSWORD__; const __DB_NAME__ = __DB_NAME__; function __construct() { if (self::$connection == null){ self::$connection = mysql_connect(__DB_HOST__,__DB_USERNAME__,__DB_PASSWORD__) or die('Unable to Connect to SQL Host'.__DB_HOST__); @mysql_select_db(__DB_NAME__) or die('Unable to Select DB: '.__DB_NAME__); } } //Regular SQL query such as delete, update, etc. public static function dbQuery($sql_string) { //Handle the rest of the SQL query here if (!$sqlResult = mysql_query($sql_string, self::$connection) ){ //Let's output the MySQL error if we have one die(' <div style="border:1px solid red;color:red;background:yellow;"> <p>'.$sql_string.'</p> SQL Error:'. mysql_error(self::$connection).' </div>' ); } else { //Return the sql result if (strpos($sql_string, "DELETE")){ if (mysql_affected_rows($sqlResult) > 0){ return $sqlResult; } else{ return false; } } else{ return $sqlResult; } } } //Return all results from sqlquery in array public static function dbDataArray($sql_string){ $data = array(); $dataQuery = self::dbQuery($sql_string); $i = 1; while(($row = mysql_fetch_assoc($dataQuery)) !== false){ foreach($row AS $key=>$val){ $data[$i][$key] = $val; } $i++; } return $data; } }
Константы определяются в другом файле, который загружается перед классом, поэтому они будут присутствовать.
Ошибка, которую я сейчас получаю, заключается в следующем.
Неустранимая ошибка: доступ к необъявленному статическому свойству: db :: $ connection
Похоже, что это делает соединение прекрасным. Я просто не могу получить доступ к соединению, используя функцию dbQuery. Функция dbQuery используется во всех других функциях.
Это только начало класса, и оно основано на группе функций, которые я уже использовал.
Конечной целью, когда она работает, является возможность передать имя базы данных классу и получить доступ к этой базе данных в этом конкретном экземпляре, поэтому я могу использовать несколько баз данных в проектах, которые планирую использовать в этом.
Для того, чтобы ваш класс работал статически, вам нужно сделать несколько вещей.
Во-первых, сделайте соединение статическим, например
private static $connection;
Во-вторых, почему все подчеркивания?
define('DB_HOST', 'localhost'); define('DB_NAME', 'your_db_name'); define('DB_USER', 'username'); define('DB_PASS', 'password');
Кроме того, зачем вообще использовать константы класса? Просто используйте константы, которые вы уже определили.
В-третьих, потеряйте конструктор. Вы не можете ожидать создания экземпляра этого класса и использовать его статически. Я бы пошел на ленивый подход для подключения
private static function getConnection() { if (self::$connection === null) { $dsn = sprintf('mysql:host=%s;dbname=%s;charset=utf8', DB_HOST, DB_NAME); self::$connection = new PDO($dsn, DB_USER, DB_PASS, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC )); } return self::$connection; }
Затем ваши общедоступные методы будут называть этот метод внутренне. Я также dbDataArray
методом dbDataArray
чтобы показать вам, как вернуть ассоциативный массив
public static function dbDataArray($query, $params = array()) { $stmt = self::getConnection()->prepare($query); $stmt->execute($params); return $stmt->fetchAll(); }