PHP: PDO (mysql) с использованием bindValue возвращает неверный результат

#php #pdo

#php #pdo

Вопрос:

Код, который я получил до сих пор, возвращает то, что мне нужно. Я не вижу, что здесь происходит не так. При «плохой» корректировке кода он дает правильный вывод, но я думаю, что лучше сделать это правильно. И почему это не работает?

неверный вывод: Array ( [L] => L)

правильный вывод: массив ([L] => 9)

этот код выдает неверный вывод:

 public function getStockByID_SIZE($size, $stockId){
    try {

    $this->_dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

    $sth=$this->_dbh->prepare("SELECT :size from stock WHERE id_product = :stockId"); 
    $sth->bindValue(':size', $size, PDO::PARAM_STR);
    $sth->bindValue(":stockId", $stockId);

    $sth->execute();
    $result = $sth->fetch(PDO::FETCH_ASSOC);
    return $result;

    } catch (PDOException $e) {     
        return "Error";  
    }
}
 

Тот же код, но с (неправильной) настройкой, возвращает правильный код:

  $sth=$this->_dbh->prepare("SELECT $size from stock WHERE id_product = :stockId"); 
 

//по сравнению с:

  $sth=$this->_dbh->prepare("SELECT :size from stock WHERE id_product = :stockId");
 $sth->bindValue(':size', $size); //use of PDO::PARAM_STR doenst matter for outcome
 

Ответ №1:

$sth=$this->_dbh->prepare("SELECT L from stock WHERE id_product = :stockId"); это правильный путь.

Ваш способ просто делает SELECT 'L' from stock WHERE id_product = :stockId , что дает вам результат 'L' .

Вы можете просто сделать что-то вроде приведенного ниже после проверки $size ,

$sth=$this->_dbh->prepare("SELECT $size from stock WHERE id_product = :stockId");

Комментарии:

1. но L меняется, я мог бы использовать размер $, но это нормально?. Я скорректирую op

2. @Rob Что значит $size — это проверка?

3. этот $size проверяется перед тем, как он войдет в функцию класса. Должно ли это быть также в самой функции класса?

4. @Rob Тогда вы можете использовать его в своем sql.