Заставить это выполнение работать без глобального объекта pdo - PullRequest
1 голос
/ 09 августа 2011

Итак, я пытаюсь заменить свои глобальные переменные, и я застрял в том, как это пройти.

Небольшой пример моего кода:

# index.php:

include "dbc.php";
echo cName(1);

# dbc.php:

try{
$connect = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset:UTF8", DB_USER, DB_PASS, $driver_options);
}
catch(PDOException $pe)
{
  die('Could connect to the database because: ' .$pe->getMessage());
}
function cName($cID){
 global $connect;
 $sql = $connect->prepare("SELECT name FROM cocos WHERE id=:id");
 $sql->bindValue(":id", $cID);
 $sql->execute();
 $sql = $sql->fetch();
 return $sql["name"];
}

Как видите, я делаю глобальный $ connect внутри функции cName (). И то же самое я делаю со всеми своими другими функциями, что выглядит очень плохо.

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

Я знаю, что могу добавить параметр, cName ($ connect, 1)

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

Так, что я могу сделать с этим, не имея дополнительного параметра или каких-либо глобальных переменных?

Я подумал, что, возможно, вы могли бы создать одну функцию / класс / объект, который обрабатывает все сообщения с базой данных, но я не знаю, с чего начать и как это сделать?

Что-то вроде:

dbQuery ($ запроса);

но опять же, вы не можете указать bindValue (), и в некоторых случаях вам нужно связать более одного значения, чем в примере выше.

Очень надеюсь на решение для этого, спасибо вперед

Пожалуйста, задавайте в комментариях, если вопросы

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Я буду предисловие, говоря, что я в лучшем случае средний на php .... Это, как говорится:

class Database 
{ 
    public $dbh;   // handle of the db connexion 
    private static $dsn  = 'mysql:host=localhost;dbname=DBNAME HERE'; 
    private static $user = 'DBUSERNAME HERE'; 
    private static $pass = 'PASSWORD HERE'; 


    public function factory() { 
      return $dbh = new PDO(self::$dsn,self::$user,self::$pass); 
    } 
} // end of Database Class

Затем в вашей функции вызовите экземпляр facotry ().

function cName($cID)
{ 

   // call Database::factory, gives you access to methods and properties
   $db= Database::factory(); 

   $sql = $db->prepare("SELECT first_name FROM users WHERE id=:id"); 
   $sql->bindValue(":id", $cID); 
   $sql->execute(); 
   $sql = $sql->fetch(); 

   // return the values
   return $sql["first_name"];

} // end of cName function

Вы можете расширить класс Database, если хотите сделать его более модульным, более простым в настройке и т. Д. *

Надеюсь, это поможет ... опять же, я не эксперт.

0 голосов
/ 09 августа 2011

Как насчет использования статического метода, который возвращает экземпляр PDO?Он занимает одну строку, как и глобальное $ connection, и если вы будете использовать multiton вместо singleton , вы можете выбрать, какую базу данных вы хотите ..

...