ПДО (MySQL), то подключение и класс запроса, безопасности и логики


За последние несколько дней я пытался выяснить, как работать с MySQL и PDO. Хотя я старалась много читать на эту тему, есть еще много вещей, которые я не понимаю.

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

Класс делает соединение и возвращает запрос:

class Connection
{
private $username = "xxxx";
private $password = "xxxx";
private $dsn = "mysql:host=host;dbname=name_db";
private $sql;
private $DBH;

function setSQL($sql){
    $this->sql = $sql; //if $sql is not set it troughs an error at PDOException
}

public function query()
{
    //the connection will get established here if it hasn't been already
    if (is_null($this->DBH))
        try {  
            $this->DBH = new PDO( $this->dsn, $this->username, $this->password );
            $this->DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

            //query 
            $result = $this->DBH->prepare($this->sql); 
            $result->execute();
            return $result->fetch(PDO::FETCH_ASSOC);                

        } catch(PDOException $e) {  

            echo "I'm afraid I can't do that1.";  
            //file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);  
        }
}

//clear connection and variables
function __destruct(){
        $this->DBH = null;
}

}

С помощью класса:

$sql = "SELECT * from stock WHERE id = 302"; 
$test = new Connection();
$test->setSQL($sql);
echo $test->query();


3941
4
задан 31 октября 2011 в 06:10 Источник Поделиться
Комментарии
2 ответа

1) при использовании ПДО, вы хотите получить преимущества автоматический выход параметра.
Оборачивание класс ПДО вы не ограничивая его функциональность. Проверить этот вопрос для лучшего примера:

https://stackoverflow.com/questions/6366661/php-pdo-parameterised-query-for-mysql

2) каждый раз, когда вы запустите запрос, вы создаете новый экземпляр PDO. Это может быть лучше иметь приложение пула ресурсов, который вы сможете получить настроенный дБ ручка.

3) Вы написали какой-то SQL, чтобы быть в состоянии принести запас по ID, что, вероятно, должен быть функционал, который является многоразовым.

сочетание 1 & 2 & 3 .. код будет, вероятно, выглядеть лучше, как что-то вроде этого:

class ApplicationResourcePool 
{
static var $_dbHandle;

private static $_dbConfig = array(
'dsn' => '',
'username' => '',
'password' => '',

);
public static getDbHandle(){
if(self::$_dbHandle == null){
self::$_dbHandle = new PDO(
self::$_dbConfig['dsn'] ,
self::$_dbConfig['username'],
self::$_dbConfig['password']
);
}
return self::$_dbHandle;
}

}

class StockMapper
{
protected $_dbh;
public __construct($dbh = null)
{
if($dbh == null){
$this->_dbh = ApplicationResourcePool::getDbHandle();
} else {
$this->_dbh = $dbh;
}

}
public getStockById($stockId){

$sth=$this->_dbh->prepare("SELECT * from stock WHERE id = :stockId");
$sth->bindParam(":stockId", $stockId);
$sth->execute();
$result = $sth->fetch(PDO::FETCH_ASSOC);
return $result[0];
}
}

тогда ваш блок кода будет:

$stockMapper = new StockMapper();
$stockData = $stockMapper->getStockById('302');

3
ответ дан 31 октября 2011 в 06:10 Источник Поделиться

Два вопроса:

1) я бы разместить код, чтобы открыть соединение в конструкторе.

2) Вы хотите посмотреть на параметризованных подготовленные заявления.

Вы хотите отправить запрос типа:

SELECT * from stock WHERE id = ?

Затем отправить массив parmeteters:

array(302)

Это позволит предотвратить SQL-инъекции.

0
ответ дан 31 октября 2011 в 06:10 Источник Поделиться

Другие вопросы по теме
Базы данных MySQL подключение в конструкторе
1 ноября 2011 в 11:11
в MVC улучшения - 0 - to_do
1 ноября 2011 в 03:11
Это правильный шаблон фабричный метод?
2 ноября 2011 в 07:11