Ошибка во время выполнения 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));
}
 
А как обойти такой запрос где AND есть, напишите пожалуйста

SELECT * FROM users WHERE username='$username' AND password='$passwordx'
 
Перечитай предыдущий ответ пару раз.
про AND там ничего не сказано
 
Это я уже в продолжении темы о запросах спрашиваю чтобы новую тему не создавать, в том то и дело что в мануале я про AND не нашел ничего
 
в каком мануале?
если ты еще не догадался, то ты выдумал себе проблему на пустом месте.
Запрос с AND абсолютно НИЧЕМ не отличается от любых других запросов, и никак специально его обходить не надо.
 
дело в том что я использую свою универсальную функцию, и как тут добавить возможность 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 сделать, только один же знак вопроса должен быть
Если не сложно напишите свой пример, чтобы я уяснил, на примере понятнее
 
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
 
переменные для замены плейсхолдеров, которые передаются в execute.
поскольку ты не знаешь, сколько переменных будет в запросе, то надо использовать массив.
 
Все написал, большое спасибо всем кто откликается на мои просьбы о помощи, очень отзывчивый форум
 
Сверху