Intereting Posts
Обрезаемая Неустранимая ошибка: Аргумент 1 передан? Symfony2.1 Как использовать RDBMS по-исполнительски поверх Zend_Db_Table? (если вообще…) Параметрированные запросы PHP / MySQL Почему я получаю эту ошибку с Laravel: PHP Catchable Fatal Error? Автозаполнение формы, заполненной базой данных? Как получить дочерний объект PHP DOMDocument по индексу Magento – получение продуктов с определенным значением атрибута Выбранный снижается динамически с помощью javascript при перезагрузке страницы и изменит другой выпадающий список и так далее Как перейти на якорь на submit – не вверху страницы Почему этот файл .htaccess mod_rewrite не работает? Следует ли переименовать загруженные файлы? Автоматически создавать json-файл, в котором перечислены все изображения в каталоге? подсчитывая количество выполняемых сценариев Должен ли я использовать ENT_QUOTES с htmlspecialchars или нет? PDO возвращает неверные, но повторяющиеся данные. Ключ отсутствует в базе данных.

Попытка создать статический класс базы данных, доступ к которому я могу получить из любой функции вне класса

ОБНОВЛЕНО: Изменен код для текущего кода рабочего класса с использованием 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 используется во всех других функциях.

Это только начало класса, и оно основано на группе функций, которые я уже использовал.

Конечной целью, когда она работает, является возможность передать имя базы данных классу и получить доступ к этой базе данных в этом конкретном экземпляре, поэтому я могу использовать несколько баз данных в проектах, которые планирую использовать в этом.

Solutions Collecting From Web of "Попытка создать статический класс базы данных, доступ к которому я могу получить из любой функции вне класса"

Для того, чтобы ваш класс работал статически, вам нужно сделать несколько вещей.

Во-первых, сделайте соединение статическим, например

 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(); }