2013-04-25 4 views
4

Я создаю класс PDO для использования в моих проектах, но поскольку я новичок в этом, я не могу привязывать параметры к подготовленному SQL-выражению, не допуская ошибок. Вот функция, которая Мент это сделать:PDO - bindParam не работает

# ::bindParam 
public static function bind() 
{ 
    # get function arguments 
    $args = func_get_args(); 

    # check for any arguments passed 
    if (count($args) < 1) 
    { 
     return false; 
    } 

    foreach ($args as $params) 
    { 
     # named variables for convenience 
     $parameter = $params[0]; 
     $variable = $params[1]; 
     $data_type = isset($params[2]) ? $params[2] : PDO::PARAM_STR; 
     $length = isset($params[3]) ? $params[3] : null; 

     # bind param to query 
     Database::$statement->bindParam($parameter, $variable, $data_type, $length) or die('error'); 
    } 
} 

и подготовленное заявление SQL:

SELECT * FROM `users` WHERE `email` = :email AND `password` = :password LIMIT 1 

Может кто-то мне точку в правильном направлении? В этот момент запрос не вызывает ошибок. Обратите внимание, что я предполагаю, что проблема здесь, хотя это может и не быть, поскольку я использую только bindParam() и prepare().

редактировать - триггер код

$email = $_POST['email']; 
    $password = $_POST['password']; 

    $password = hash('sha256', $password); 

    $this->db->prepare('SELECT * FROM `users` WHERE `email` = :email AND `password` = :password LIMIT 1'); 
    $this->db->bind(
     array(':email', $email), 
     array(':password', $password) 
    ); 
    $status = $this->db->execute(); 

    if ($status) 
    { 
     $result = $this->db->fetch('assoc'); 

     $this->template->user = $result; 
    } 
    else 
    { 
     $this->template->user = false; 
    } 
+0

введите код, который вызывает функцию – hek2mgl

+0

Как вы называете эту функцию? –

+0

проверить обновленный вопрос – yoda

ответ

9

Как уже упоминалось в @YourCommonSense, необработанный интерфейс PDO немного понятнее, однако проблема, вероятно, связана с использованием функции PDOStatement::bindParam() вместо PDOStatement::bindValue().

Разница между этими двумя заключается в том, что первый принимает variable reference, который постоянно перезаписывается в вашем цикле foreach, в то время как последний принимает фактическое значение переменной.


Если вы ищете какой-то более дружественный интерфейс подключения к базе данных, почему не вы пытаетесь Doctrine DBAL?

+0

Спасибо, PDO не давал мне никакого намека на это. Мне нужно создать свою собственную маску для использования PDO для расширения моделей в архитектуре MVC. – yoda

+0

+1 для рекомендации каркаса, а не для решения проблем с ПДО «втирать палочки вместе, чтобы сделать огонь». – tadman

3

Просто избавиться от этой функции, PDO уже имеет его

$email = $_POST['email']; 
$password = $_POST['password']; 

$password = hash('sha256', $password); 

$this->db->prepare('SELECT * FROM `users` WHERE `email` = :email AND `password` = :password LIMIT 1'); 
$stmt = $this->db->execute(array(':email'=> $email,':password' => $password)); 
$this->template->user = $this->db->fetch(); 

Это все код, который нужно (если ваш класс выполнить это обычный PDO)

Или, чтобы сделать его необработанным PDO:

$email = $_POST['email']; 
$password = $_POST['password']; 
$password = hash('sha256', $password); 

$sql = 'SELECT * FROM users WHERE email = ? AND password = ? LIMIT 1'; 
$stmt = $this->db->prepare($sql); 
$stmt->execute(array($email, $password)); 
$this->template->user = $stmt->fetch(); 

Итак, кажется, что вашему классу требуется больше кода, чем необработанный PDO. Вы уверены, что вам нужен этот класс?

+0

Что делать, если мне нужны другие необязательные параметры на bindParam()? – yoda

+0

Почему вы удалили именованные параметры? Они делают привязки практически невозможными. – tadman

+0

@ йида получил пример? Единственная известная мне проблема - это предложение LIMIT, которое можно легко решить. –

Смежные вопросы