Проблема PHP PDO

  • Автор темы fzn7
  • 44
  • Обновлено
  • 13, May 2024
  • #1
Получился странный. Только начал работать над новым проектом.

В настоящее время работаю над пользовательским классом. Класс пользователя будет иметь функцию сохранения, позволяющую обновлять соответствующие таблицы, связанные с учетной записью пользователя.

Функция выглядит следующим образом:
 

function save() {

global $pdo;

$sql = 'UPDATE user_account SET ';

$counter = 0;

foreach ( $this->details as $key=>$field) {

if ( $key != 'ua_id') {

if ($counter > 0 ) {

$sql .= ', ';

}

$sql .= ''. $key.'=:'.$key;

$counter++;

}

}

$sql .= ' WHERE ua_id=:ua_id LIMIT 1';

$stmt =$pdo->prepare($sql);

foreach ( $this->details as $key=>$field) {

if ($key == 'ua_id') {

$field = (int)$field;

}

$stmt->bindParam(':'.$key,$field);

}

$stmt->execute();

}



PHP: $this->details — это, по сути, массив всех полей таблицы user_account.

У меня проблема в том, что запрос выполняется, но ни одна строка не затрагивается, поэтому никаких изменений не происходит. $stmt->errorInfo(); не показывает ошибок. Когда я копирую запрос, сгенерированный в функции сохранения, а затем заменяю заполнители значениями, все работает отлично.

Я знаю, что это будет небольшая ошибка, но я не могу сказать, где именно.

Любое предложение, что я могу попробовать?

fzn7


Рег
01 Jan, 2011

Тем
1

Постов
3

Баллов
13
  • 18, May 2024
  • #3
Это кажется проще
 $sql = 'UPDATE `user_account` SET ';

$keys = array_keys($this->details);

$counter = count($keys) - (in_array('ua_id', $keys)? 1:0);

$sql .= implode(', ', array_map(

function ($k) { return sprintf("%s = :%s", $k, $k); },

array_keys($this->details)

));

$sql .= ' WHERE ua_id=:ua_id LIMIT 1';

// if ua_id isn't in $this->details then we have to find it and add it or the update won't work

$stmt =$pdo->prepare($sql);

$stmt->execute($this->details);
PHP:
 

Сергей Мезенцев


Рег
15 Dec, 2011

Тем
0

Постов
2

Баллов
2
  • 18, May 2024
  • #4
Подготовленные операторы следует использовать абсолютно для каждого запроса, независимо от того, где находится источник используемых данных.



Можете ли вы гарантировать, что источником данных никогда не будет пользователь? Я знаю, что не смог бы. Используя подготовленные операторы абсолютно для каждого запроса, вы не рискуете случайно создать угрозу безопасности, если источник данных для запроса будет изменен на предоставленные пользователем данные позднее.
 

Koshkencia


Рег
01 Jan, 2011

Тем
0

Постов
3

Баллов
3
  • 19, May 2024
  • #5
хм, интересно, что если я не буду использовать bindParam для ua_id и напишу вот так
 
$sql .= ' WHERE ua_id='.$this->details['ua_id'].' LIMIT 1';
PHP: тогда все работает нормально. Есть идеи, почему это так?
 

Dimal88


Рег
06 Dec, 2013

Тем
0

Постов
2

Баллов
2
  • 11, Jun 2024
  • #6
Я нахожу этот код.

тревожным.

Одна из главных причин, по которой функции mysql_ пошли по пути дронта, заключалась в том, чтобы заставить нас ПРЕКРАТИТЬ включение переменных в строки запроса.

Такое динамическое предоставление полей просто напрашивается на неприятности, и я НАСТОЯТЕЛЬНО советую против этого. ПОЖАЛУЙСТА, скажите мне, что $this->details не поступает со стороны клиента!
 

Мища


Рег
18 Jan, 2013

Тем
1

Постов
3

Баллов
13
Тем
49554
Комментарии
57426
Опыт
552966

Интересно