2013-11-28 6 views
0

Извините за мой английский, я французский: D,ошибка параметра PDO в подготовленном заявлении

Хорошо, я использую PDO для моей связи с MySQL, но у меня есть одна ошибка с PDO подготовить заявление.

Я пытаюсь включить мое имя таблицы в запросе подготовки, но у меня есть сообщение об ошибке:

Ошибка: SQLSTATE [42000]: Ошибка синтаксиса или нарушение прав доступа: 1064 У вас есть ошибка в вашем SQL синтаксиса; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом с «» NbClient «LIMIT 2) как стер» в строке 1 Код ошибки: 42000

Мой код:

<html> 
    <head> 
    </head> 

    <body> 
    <?php 

    const HOST='localhost'; 
    const DBNAME='GameWave'; 
    const USER=''; 
    const PASSWORD=''; 
    const TABLE='NbClient'; 

    echo GetNbClientByHour(2); 


    function GetNbClientByHour($nb_heure) 
    {  
     $hookConstTable = TABLE; 


     try 
     { 
      $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; 
      $connexion = new PDO('mysql:host='.HOST.';dbname='.DBNAME, USER, PASSWORD, $pdo_options); 

      $prepare=$connexion->prepare('select SUM(record) from (select v_tot as record from :tab LIMIT :nb_heure) as sr;'); 
      $prepare->bindParam(':tab', $hookConstTable, PDO::PARAM_STR); 
      $prepare->bindParam(':nb_heure', $nb_heure, PDO::PARAM_INT); 
      $prepare->execute(); 

      $resultat = $prepare->fetch(); 
      $prepare->closeCursor(); 

      return $resultat[0]; 
     }    
     catch(Exception $e) 
     { 
      echo 'Error : '.$e->getMessage().'<br />'; 
      echo 'Error Code : '.$e->getCode(); 
     } 
    } 
    ?> 
    </body> 
</html> 

Но если я попытаюсь написать имя таблицы в запросе, ее работа ...

$prepare=$connexion->prepare('select SUM(record) from (select v_tot as record from NbClient LIMIT :nb_heure) as sr;'); 
$prepare->bindParam(':nb_heure', $nb_heure, PDO::PARAM_INT); 

Не могли бы вы мне помочь?

+0

Если ничего другого, почему бы просто не выбрать сумму (v_tot) как запись из nbclient'? Нет причин для подвыборки –

ответ

2

Проблема здесь:

select v_tot as record from :tab LIMIT :nb_heure 

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

+0

Это действительно раздражающее ограничение PDO, которое кто-то должен исправить. – tadman

+0

Согласовано. Я использую переменную '$ table', а иногда' switch() 'для ее дезинфекции, но это далеко не универсальное решение. – Nevertheless

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