2013-08-22 3 views
0

Упреждающее извинение: сообщение содержит основные вопросы. Однако я искал и не нашел ответа, если есть один ... извините.Подключение к базе данных MySQL с PDO

Я следую некоторым учебникам по youtube для создания базового веб-чата ajax, а в учебнике человек использует MySQLi для подключения к БД. Я хочу создать одно и то же приложение для чата ajax, за исключением того, что я хочу использовать PDO вместо MySQLi.

Человек использует эти два файла:

config.php

<?php 
    define('DB_HOST', 'localhost'); 
    define('DB_USER', 'bucky_chat'); 
    define('DB_PASSWORD', '123456'); 
    define('DB_NAME', 'bucky_chat'); 
?>` 

chat.class.php

<?php 
    require_once('config.php'); 
    require_once('error_handler.php'); 

class Chat { 

    private $mysqli; 

    //constructor opens DB connection 
    function __construct(){ 
     $this->mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 
    } 

    //destructor closes db connection 
    function __destruct(){ 
     $this->mysqli->close(); 
    } 

} 

?> 

Я пытаюсь повторить вышеуказанные фрагменты с PDO. Проблема в том, что я не уверен, как адаптировать примеры PDO, на которые я смотрел, чтобы это сделать.

Прежде всего я смущен, почему он определил эти вещи в отдельном файле .. есть ли какие-либо преимущества в этом?

В другом PDO уроке я смотрю я вижу, это может быть сделано следующее образом:

<?php 
$config['db'] = array(
'host' => 'localhost', 
'username' => '', 
'password' => '', 
'dbname' => '' 
); 

$db = new PDO('mysql:host=' . $config['db']['host'] . ';dbname=' . $config['db']['db_name'], $config['db']['username'], $config['db']['password']); 
//some code 
$db = null; //closes connection 
?> 

`

Я думать это то, что мне нужно использовать (в попытке поймать блок), но почему он помещает эти вещи в массив? это, кажется, усложняет вещи ... почему не просто переменные? Но этот код реплицирует пример mysqli? Howcome Я не вижу, что __construct() используется с PDO?

Некоторые второстепенные вопросы ... При создании сайта с пользователем существует ли стандартное место для хранения соединения с БД? Есть рекомендации?

Извините за все эти вопросы, вся помощь посильно оценена!

+0

проще перетащить один массив с кучей значений внутри него, а не кучу отдельных переменных. –

ответ

-1

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

вы можете сделать:

try 
{ 
    $PDOConnection = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.'', DB_USER, DB_PASS); 
    $PDOConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    //Do you stuffs 

    $PDOConnection = null; 
} 
catch(PDOException $e) 
{ 
    //Do something with error 
} 
-1

Почему бы не просто сделать:

<?php 
$hostname = 'host'; 
$dbname = 'dbname'; 
$username = 'uname'; 
$password = 'pw'; 

try { 
$db = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

} 
catch (PDOException $ex) { 
    echo "An Error occurred!"; 
} 
?> 

В отдельном PHP файл я называю моим dbPDO.php и затем:

require_once("dbPDO.php"); 

В ваши страницы PHP. Затем выполните запросы:

EDIT: конденсировать мой ответ.

$username = $_POST['username']; 
$stmt = $db->prepare("SELECT field1, field2, field3, etc FROM mytable WHERE username = :username"); 
$stmt->bindParam(':username', $username); 
$stmt->execute(); 
    while ($r = $stmt->fetch()) { 
    $field1 = $r['field1']; 
    $etc = $r['etc']; 
} 

Убедитесь, что вы связываетеParam и используете ':' в запросе.Не просто введите WHERE username = $ username или WHERE username = $ _POST ['username'] Это приведет к тому, что вы подвержетесь SQL Injection. Кроме того, я не показывал его здесь, но для каждого запроса у вас должна быть какая-то обработка исключений. Я помещаю весь запрос в Try/Catch, но я слышал, что есть другие способы борьбы с ним. Я лично считаю его личным предпочтением.

+0

Это то, что я хочу сделать, но А) это следует за лучшей практикой? B) могу сказать, например: $ username = $ _POST ['username']; для подключения разных пользователей к db? –

+0

Честно говоря, я не уверен, что это «лучшая практика». Я немного новичок в PDO. Я унаследовал кучу веб-сайтов, которые использовали функции mysql_ (чего, очевидно, следует избегать), и я сам научил себя PHP и PDO через несколько недель. – wiscWeb

+0

Вы хотели бы использовать подготовленные статусы ... Сообщение, полученное из формы предыдущей страницы, правильно? – wiscWeb

-1

Прежде всего, вам не нужен массив, ни переменные, вы можете непосредственно ввести configuration..like:

try { //try connection 

    //common db 
    $db = new PDO('mysql:host=localhost;dbname=some_db_name', 'some_usernane', 'some_pass'); 

    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 


    } catch (Exception $e) { //connection failed 

    die("Oh no! It seems we took too long to respond, we are sorry for that.."); 

    } 

Во-вторых _constructor() означает, что всякий раз, когда класс Chat называется все в _constructor() выполняется.

Вот хороший учебник для PDO http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

+0

Что делать, если я пытаюсь подключить разных пользователей к базе данных? не лучше ли иметь какую-то переменную? –

+0

Да, вы можете, это до вас, я не думаю, что это главная проблема. –

+0

Downvoter, пожалуйста, дайте повод для downvote .. –

1

Чтобы ответить на ваши вопросы:

Прежде всего я запутался, почему он определил эти вещи в отдельном файле

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

но почему он поставил эти вещи в массиве

Я думаю, что это просто сделано в регистре данные аутентификации необходимы кто-то еще в сценарии (так же, как определенные глобалов от вашего первого образец). Его часто лучше всего определять параметры в переменных (даже если вы используете переменную один раз). Таким образом, если вы опечатаете переменную, вы получите сообщение об ошибке; по сравнению с копией и вставкой одной и той же строки снова и снова.

Howcome Я не вижу __construct() используется с PDO

Когда бы вы создать новый объект в PHP, вам не нужно вызывать __construct, она вызывается автоматически с " новый ".

$PDOConnection = new PDO($dsn, $username, $password); 

При создании веб-сайта с пользователем, есть стандартное место для хранения DB соединения

Определенно убедитесь данные аутентификации хранятся в недоступных файлов для общественности. Объект соединения не имеет вреда для доступа публики (если, конечно, вам не нужно аутентифицировать клиента (пользователя веб-сайта) до установления соединения с базой данных). Является ли это лучшая практика, чтобы всегда начать свои (крепят) файлы PHP с:

<?php 

НО ... никогда не закончится файл с «>?». Если после «?» «Аварии» добавлен лишний символ, ваш веб-сервер может отобразить весь ваш сценарий в мире (конечно, ваш Apache и т. Д. ... должен быть настроен неправильно). Как я сказал ... лучшие практики.

Рекомендации каких-либо книг?

Возможно, Google может использовать «лучшие практики передовых технологий php».

0

Вы сбиваете с толку WAY TOO MUCH вещи, которые могут быть объяснены в одном ответе. вы даже не знаете, что спросить.

Пожалуйста, не используйте искусство программирования как своего рода дешевый трюк, который можно узнать за 2 часа. Чтобы написать чат AJAX, нужно учиться, по крайней мере, несколько месяцев. Чтобы учиться, понимая, а не копированием. Изучать шаг за шагом, переходя от переменных к массивам, от массивов к функциям, от функций к классам и т. Д. - не бросая весь код, который они находят в одной чаше, а затем спрашивают о том, как справиться со всем этим. Нельзя перейти на другой шаг, не понимая предыдущего. И, конечно же, все эти учебные пособия по youtube являются окончательными кусками бесполезного мусора.

некоторые из ваших неурядиц являются:

__construct() метод на самом деле не имеет ничего общего с PDO. Не с mysql. это метод класса чата. И метод, который все неправильно. Класс чата не должен создавать свое собственное соединение, а использовать уже созданный.

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

Вы должны не использовать этот код в блоке catch try (если у вас нет идеи, что делать в случае ошибки, что я сомневаюсь, что у вас есть).

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

Основы PDO вы можете получить прямо здесь, в tag wiki. Но основы ООП не так-то просто.

+0

Спасибо за ядро ​​конструктивной критики, я выплю из необоснованных предположений, которые не имеют места в техническом ответе. –