Ошибка во время выполнения update PDO

imediasun

Новичок
Возникает следующая ошибка
SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters#0 /var/www/clients/client1/web28/web/protected/Main.php(72): PDOStatement->execute(Array) #1 /var/www/clients/client1/web28/web/protected/models/User.php(59): Main->update_obj('users', 'activation_code', Array, Array, '0096deb29bf3199...') #2 /var/www/clients/client1/web28/web/protected/UsersController.php(82): User->confirm_registration('0096deb29bf3199...') #3 [internal function]: UsersController->activate('0096deb29bf3199...') #4 /var/www/clients/client1/web28/web/index.php(26): call_user_func_array(Array, Array) #5 {main}

Что здесь не так, вродебы все по мануалу
PHP:
$data = array(
  'activated' => 1
  );
     foreach($data as $key=>$val){
     $fields[]=$key;
     }
     $obj=$activation_code;
$result =parent::update_obj($table_name,$obj_id,$fields,$data,$obj);

function pdoSet($fields, &$values, $source = array()) {
  $set = '';
  $values = array();
  if (!$source) $source = &$_POST;
  foreach ($fields as $field) {
  if (isset($source[$field])) {
  $set.="`".str_replace("`","``",$field)."`". "=:$field, ";
  $values[$field] = $source[$field];
  }
  }
  return substr($set, 0, -2);
}

function update_obj($table_name,$obj_id,$fields,$data,$obj){
print('update_obj');
$sql = "UPDATE ".$table_name." SET ".$this->pdoSet($fields,$values,$data)." WHERE ".$obj_id." = ?";
$stm = $this->conn()->prepare($sql);
$stm->execute(array($obj));
}
 

imediasun

Новичок
А как обойти такой запрос где AND есть, напишите пожалуйста

SELECT * FROM users WHERE username='$username' AND password='$passwordx'
 

Фанат

oncle terrible
Команда форума
Перечитай предыдущий ответ пару раз.
про AND там ничего не сказано
 

imediasun

Новичок
Это я уже в продолжении темы о запросах спрашиваю чтобы новую тему не создавать, в том то и дело что в мануале я про AND не нашел ничего
 

Фанат

oncle terrible
Команда форума
в каком мануале?
если ты еще не догадался, то ты выдумал себе проблему на пустом месте.
Запрос с AND абсолютно НИЧЕМ не отличается от любых других запросов, и никак специально его обходить не надо.
 

imediasun

Новичок
дело в том что я использую свою универсальную функцию, и как тут добавить возможность AND вносить?

PHP:
function get_obj($field,$table_name,$obj_id,$name){
print('get_obj');
$stmt = $this->conn()->prepare('SELECT '.$field.' FROM '.$table_name.' WHERE '.$obj_id.' = ? ');
$stmt->execute(array($name));//это же значение заменяет знак вопроса
$row = $stmt->fetch();
return $row;
}
я так и не понял как с помощью execute два WHERE сделать, только один же знак вопроса должен быть
Если не сложно напишите свой пример, чтобы я уяснил, на примере понятнее
 

Фанат

oncle terrible
Команда форума
AND вносить очень просто.
Не нужно использовать никаких своих универсальных функций.
Если для insert такая функция еще оправдана, то для селектов не надо заниматься глупостями, а надо просто передавать в функцию SQL запрос.
Не надо пытаться дублировать функционал SQL - у тебя все равно не получится.
PHP:
function query($sql,$data){
    $stmt = $this->conn()->prepare($sql);
    $stmt->execute($data);
    return $stmt;
}
Тебе нужен только этот код. Все остальное - дурь и подростковые фантазии.

получать свои данные будешь так
PHP:
$user = $db->query('SELECT * FROM users WHERE username=? AND password=?',[$username, $password])->fetch();
Со временем ты поймешь, почему надо так, а не иначе, а пока просто запомни.

Все семейство функций get_* также на помойку.
Не надо пытаться дублировать функционал PDO - в нем уже все есть, что тебе нужно.
Данные из запроса надо получать встроенными функциями PDO.

Другие примеры можно посмотреть здесь: http://phpfaq.ru/pdo/pdo_wrapper#samples
 

Фанат

oncle terrible
Команда форума
переменные для замены плейсхолдеров, которые передаются в execute.
поскольку ты не знаешь, сколько переменных будет в запросе, то надо использовать массив.
 

imediasun

Новичок
Все написал, большое спасибо всем кто откликается на мои просьбы о помощи, очень отзывчивый форум
 
Сверху