2013-07-25 2 views
-2

Я читал много сообщений здесь, в StackOverFlow, и информацию о документации в php dot net.PDOStatement :: bindParam && PDOStatement :: bindValue не работает

Вот код, я tryng:

Пример 1

$id = 1; 
$sth = $this->pdo->prepare('SELECT * FROM USERS_TABLE WHERE ID_USR = ?'); 
$sth->execute(array(intval($id))); 

Пример 2

$id = 1; 
$sth = $this->pdo->prepare('SELECT * FROM USERS_TABLE WHERE ID_USR = :id'); 
$sth->bindParam(':id', $id, PDO::PARAM_INT); 
$sth->execute(); 

Пример 3

$id = 1; 
$sth = $this->pdo->prepare('SELECT * FROM USERS_TABLE WHERE ID_USR = :id'); 
$sth->bindValue(':id', intval($id)); 
$sth->execute(); 

Если я пытаюсь это:

$sth = $this->pdo->prepare('SELECT * FROM USERS_TABLE WHERE ID_USR = 1'); 
$sth->execute(); 

Я получаю результат, которого ожидаю, но это не то решение, которое я ищу.

Надеюсь, вы можете мне помочь, заранее.

////////// EDIT 1

В конце всех этих примеров я делаю это:

$arr = $sth->errorInfo(); 
print_r($arr); 

возвращенного:

Array ([0] => 00000 [1] => [2] =>)

/////////// РЕДАКТИРОВАТЬ 2

Вот код

class User { 

    private $registry; 
    private $userId; 
    private $userLan; 
    private $fullName; 
    private $dob; 
    private $email; 
    private $sex; 
    private $nationality; 
    private $valid; // User valid? 
    private $pdo; // PDO reference 

    /** 
    * Constructor del usuario. Se puede construir de dos formas, pasando email y password o pasando una id de usuario. 
    * @param Registry $registry. 
    * @param Int $id 
    * @param String $email 
    * @param String $password 
    * @param String $username 
    * @return void 
    */ 
    public function __construct (Registry $registry, $id, $email, $password, $username) 
    { 
      echo "constructor user with id = $id "; 
      $this->valid = false; 
     $this->registry = $registry; 
     if($id = 0 && $username != '' && $password != '') 
     { 
        // ... 
        $this->valid = true; 
     } 
     //else if($id > 0) 
      else 
     { 
      // $id = intval($id); 
       echo "second if"; 
       $this->pdo = $registry->getObject('db')->getPdo(); 
       try 
       { 
        $sth = $this->pdo->prepare('SELECT * FROM USERS_TABLE WHERE ID_USR = :id'); 
        $sth->execute(array(':id' => intval($id))); 
        //$sth->execute(array(intval($id))); 
        $arr = $sth->errorInfo(); 
        print_r($arr); 
        $result = $sth->fetch(PDO::FETCH_BOTH); 
        print_r($result); 
       } 
       catch(PDOException $e) 
       { 
        echo $e->getMessage(); 
       } 
       echo "passing query"; 
       if($sth->rowCount() ==1) 
        echo "yeeeha"; 
       else 
        echo "not yeeha (".$sth->rowCount().") "; 
        // ... 
        $this->valid = true; 
     } 
    } 
+1

Что происходит не так вообще? –

+0

Почему вы делаете $ sth-> errorInfo() ;? Зачем? –

+0

Проблема в том, что первые 3 примера следует правильному способу программирования, но никто не работает. Последняя попытка (использование 1 в sql) работает, но она недействительна. – Jesus

ответ

0

Ваша проверка ошибок не выглядит правильно:

$sth = $this->pdo->prepare('SELECT * FROM USERS_TABLE WHERE ID_USR = :id'); 
$sth->bindParam(':id', $id, PDO::PARAM_INT); 
$sth->execute(); 
$arr = $sth->errorInfo(); 

Это предполагает, что PDO::prepare() всегда возвращает объект, но это не то, что documentation говорит:

Возвращаемые значения

Если сервер базы данных успешно подготовил оператор, PDO :: prepare() возвращает объект PDOStatement. Если сервер базы данных не может успешно подготовить инструкцию, PDO :: prepare() возвращает FALSE или испускает PDOException (в зависимости от обработки ошибок).

Я предлагаю вам облегчить вашу жизнь и настроить PDO для исключения исключений. Этот пример взят from the manual:

$dbh = new PDO($dsn, $user, $password); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
             ^^^^^^^^^^^^^^^^^^^^^^ 
+0

Спасибо, на самом деле исправил его (@YourCommonSense дал мне другое решение для этого выше) + 1 /// В любом случае код не бросает исключения. – Jesus

+0

Ну, это проблема с «неработоспособным» в качестве единственного объяснения: любой ответ - просто слепой. –

0

Я ненавижу угадать, но единственное разумное объяснение, которое я могу найти проблемы с $ ид и отсутствие ошибок отчетности

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