2012-06-05 3 views
3

У меня есть сайт, на котором я подключаюсь к базе данных mySQL, чтобы сделать несколько запросов обычным способом. Я не делаю ничего более сложного, чем:PHP - начало подготовленных заявлений, но они кажутся неудобными

$result = mysql_query('SELECT * FROM table WHERE condition = "'.mysql_real_escape_string($_POST['condition']).'"'); 
$row = mysql_fetch_assoc($result); 
echo $row['var1'].' '.$row['var2']; 

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

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

$stmt = $db->stmt_init(); 
if($stmt->prepare('SELECT * FROM table WHERE condition = ?')) { 
$condition = $_POST['condition']; 
$stmt->bind_param('s', $condition); 
$stmt->execute(); 

$stmt->bind_result($var1, $var2, ...); 
if ($stmt->fetch()) { 
    echo $var1 . ' - ' . $var2; 
} 
} 

Так что, похоже, как ад гораздо больше кода, и немного сложнее управлять. Я не понимаю, как их использовать или есть более короткий способ делать «нормальные» вещи PHP:

  • Заполнение $ row, представляющее собой одну строку из базы данных.
  • Цитирование по строкам и заполнение строки $ рядом со следующей строкой.
  • Обычные запросы UPDATE.

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

+3

Может быть, вы должны дать этому прочитанный http://net.tutsplus.com/tutorials/php/php-database-access-are-you-doing-it-correctly/ – Gustav

+0

@Gustav Я бы принять эту ссылку и соответствующие выдержки в качестве ответа ... –

ответ

0

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

class DB { 
    protected $db; 
    protected $cache; 

    public function __construct($host, $database, $user, $pass, $charset = 'utf8') { 
    $this->db = new PDO(sprintf('mysql:dbname=%s;host=%s', $database, $host, $charset), 
         $user, $pass); 
    $this->cache = array(); 
    $this->db->query(sprintf('SET NAMES %s', $charset)); 
    } 

    public function query($query, $vars = array()) { 
    //You may input a simple value, no need for arrays with a single argument        
    if (!is_array($vars)) 
     $vars = array($vars); 

    //Short names inside the function                  
    $db = &$this->db; 
    $cache = &$this->cache; 

    //Ensure the prepared statement is in cache                
    if (!isset($cache[$query])) 
     $cache[$query] = $db->prepare($query); 

    //Execute the statement and return all rows                
    $stmt = $cache[$query]; 
    if ($stmt->execute($vars)) 
     return $stmt->fetchAll(); 
    else 
     return false; 
    } 
} 

Использование этого объекта очень близко к старым интерфейсам базы данных. Пример:

$db = new DB(host, database, user, pass); 
$result = $db->query('SELECT id, name FROM table WHERE id = ? AND address = ?', 
        array(42, 'home')); 
foreach ($result as $row) { 
    ... 
} 
Смежные вопросы