2013-04-05 2 views
4
$desc = 'DESC'; 

$getRecords = $conn->prepare('SELECT * FROM `courses` ORDER BY `id` :sort LIMIT :limitInc, :limit '); 

$getRecords->bindValue(':limit',$limit,PDO::PARAM_INT); // working 

$getRecords->bindValue(':limitInc',$limitInc,PDO::PARAM_INT); // working 

// *** The line below isn't working *** 
$getRecords->bindValue(':sort', $desc ,PDO::PARAM_STR); // not working 

$getRecords->execute(); 

Я пытаюсь вызвать $desc в моей подготовке запроса ..как удалить кавычки любой строки при подготовке запросов

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''DESC' LIMIT 0, 5' at line 1' in C:\xampp\htdocs\portfolio\nasiraan\try\indexx.php:89 Stack trace: #0 C:\xampp\htdocs\portfolio\nasiraan\try\indexx.php(89): PDOStatement->execute() #1 {main} thrown in C:\xampp\htdocs\portfolio\nasiraan\try\indexx.php on line 89

я уверен, что решение .. удалить кавычки из строки $desc ... но как ??

+0

Просто выполните '$ getRecords-> bindValue (': sort', DESC, PDO :: PARAM_STR);'? –

+2

Связывание работает только с «параметрами», его нельзя использовать для «структурирования» SQL-запроса. – Passerby

+0

Вы не можете использовать '' при предоставлении: key, как этот '': key'', просто сделайте это так: '' key'. Функции связывания помещают «для вас», поэтому позаботьтесь об этом. – botenvouwer

ответ

6

Вы должны использовать буквенные строки я боюсь, потому что заполнители не могут содержать ключевые слова, например, для порядка сортировки (среди прочих):

$query = sprintf('SELECT * FROM `courses` ORDER BY `id` %s LIMIT :limitInc, :limit ', 
    strcasecmp($desc, 'DESC') === 0 ? 'DESC' : 'ASC') 
); 
$getRecords = $conn->prepare($query); 

Построение запроса этот путь не так Плохо, потому что есть только два варианта.

+0

+1, самое простое решение. Но чтобы избежать проблем в будущем, лучше заменить '$ desc' на' strtoupper ($ desc) '. – Narek

+0

@Narek Я полагаю, что это справедливо :) –

+0

'strcasecmp ($ desc, 'DESC')? '': $ desc' shoter немного. Лучше? Не уверен:) – sectus

2

Parameter markers can be used only where data values should appear, not for SQL keywords, identifiers, and so forth.

PREPARE Syntax

Вы не можете использовать подготовленное заявление с ним.

  • Если вы хотите использовать простой синтаксис значения привязки можно использовать

    SELECT * FROM `courses` ORDER BY `id`*:sort LIMIT :limitInc, :limit 
    

Затем связать подписанную числовое значение. Но этот запрос will not be optimized by MySQL.

  • Если вы хотите, чтобы «проглотить» неправильный заказ, вы можете использовать @ решение Джека, но опечатки в направлении может получить неправильные результаты. Если важен порядок вы должны проверить оба значения:

    strcasecmp($desc, 'DESC') && strcasecmp($desc, 'ASC') ? error() : $desc; 
    

Также вы можете обернуть PDO и добавить специальный метод prepare_ordered($query, $order); или что-то более сложное и поставить сравнение там.

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

P.S. Я вижу, что вы используете эмуляцию подготовленного оператора.

+1

Хотя этот ответ верный, он бесполезен для OP –

+0

@YourCommonSense, вы правы ... дай мне время. – sectus

+0

@YourCommonSense, проверьте – sectus

-1

Я всегда расширяю PDO и добавляю некоторые из моих собственных удобных вещей. Итак, сначала вы распространяете следующее:

<?php 

    //Database class 
    class db extends Pdo{ 
     public function __construct(){ 
      global $conf; 
      try 
       { 
        parent::__construct('DBTYPE:dbname=DBNAME;host=DBHOST', 'DBUSER', 'DBPASS'); 

         $this->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
         $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
       } 
      catch(PDOException $e){ 
       throw new myPdoException($e); 
      } 
     } 

     public function quest($queryString){ 
      try 
       { 
        $query = $this->query($queryString); 

         return $query;      
       } 
      catch(PDOException $e){ 
       throw new myPdoException($e); 
      } 
     } 

     public function doPrepare($queryString, $param){ 
      try 
       { 
        $query = $this->prepare($queryString); 

        $query->execute($param); 

         return $query; 
       } 
      catch(PDOException $e) 
      { 
       throw new myPdoException($e); 
      } 
     } 

     public function doPrepareBind($queryString, $param){ 
      try 
       { 
        $query = $this->prepare($queryString); 

         foreach($param as $par){ 
          switch($par[2]): 
           case 'int': 
            $query->bindParam($par[0], $par[1], PDO::PARAM_INT); 
           break; 

           case 'str': 
            $query->bindParam($par[0], $par[1], PDO::PARAM_STR); 
           break; 
           case 'blob': 
            $query->bindParam($par[0], $par[1], PDO::PARAM_LOB); 
           break; 

           default: 
            $query->bindParam($par[0], $par[1], PDO::PARAM_STR); 
           break; 
          endswitch; 
         } 

        $query->execute(); 

         return $query; 
       } 
      catch(PDOException $e) 
      { 
       throw new myPdoException($e); 
      } 
     } 
    } 

    class myPdoException extends PdoException{ 
     private $_debug = DB_DEBUG; 

     public function __construct($e){ 
      parent::__construct($e); 

       $this->showException(); 
     } 

     private function showException(){ 
      if($this->_debug){ 
       echo 
       "<div id='transparant'><div id='error'><br /><br />" . 
        $this->message 
       . "<br /><br /><br /></div></div>"; 
      } 
      else{ 
       echo "<div id='transparant'><div id='error'><br /><br /> 
          Er is iets mis gegaan, probeer later nog eens.<br />Sorry voor het ongemak. 
         <br /><br /><br /></div></div>"; 
      } 
     } 
    } 

?> 

Вы видите родительский конструктор на 9-й строке. Заполните прописные буквы.

Обратите внимание, что DBTYPE - это тип службы базы данных, которую вы используете. Вероятно, это просто mysql.

Теперь это, как я использую это, когда стерилизацию ряд строк:.

//first include db class I made above. 
$db = new db(); 

$query = "INSERT INTO `database`.`users` (`id`, `naam`, `email`, `pass`, `key`, `status`) VALUES (NULL, :name, :mail, :pass, '$key', '0')"; 
$param = array(
        array(':name', $_POST['name']), 
        array(':mail', $_POST['mail']), 
        array(':pass', $pass_hash) 
       ); 
$query = $db->doPrepareBind($query, $param); 
+0

Я боюсь, вы не поняли вопроса –

+0

Почему проголосовали. Даже если я не ответил на вопрос, я все же даю ответ, который не является кучей дерьма. – botenvouwer

-1

$ запрос = 'SELECT * FROM courses ORDER BY id' $ по алфавиту. LIMIT: limit,: limitInc ';

$ getRecords = $ conn-> prepare ($ query); // Сохраняем мой запрос в имени переменной $ query и внутри него передал мою переменную ..поэтому теперь мне не нужно связывать его.

$ getRecords-> bindValue (': limit', $ limit, PDO :: PARAM_INT);

$ getRecords-> bindValue (': limitInc', $ limitInc, PDO :: PARAM_INT);

$ getRecords-> выполнить();

+0

В вашем вопросе нет решения, предлагаемого против SQL-инъекции. –

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