ОШИБКА PDO: PDOStatement :: execute (): SQLSTATE [HY093]: недопустимый номер параметра: число связанных переменных не соответствует количеству токенов - PullRequest
0 голосов
/ 01 июня 2018

Ошибка при попытке динамически генерировать и выполнять SQL-запрос.Я дважды проверяю выполненный запрос, и все выглядит хорошо, но я все еще получаю эту ошибку.Что я здесь не так делаю?

Предупреждение PHP: PDOStatement :: execute (): SQLSTATE [HY093]: недопустимый номер параметра: число связанных переменных не соответствует количеству токенов

Вот код:

$data = array();

$params = [
            'planid' => $_POST['planid'], 
            'email' => $_POST['email'], 
            'firstname' => $_POST['firstname'],
            'lastname' => $_POST['lastname']
        ];  


foreach ($params as $key => $value) {
        $data[':'.$key] = $value;
}


print_r($data);

//OUTPUT:

Array
(  
    [:planid] => GBP001
    [:email] => juandelacruz@myemail.com
    [:firstname] => Juan
    [:lastname] => De La Cruz
)


$sql = "INSERT INTO user (";
            $count = count($params);
            $x=1;

            foreach ($params as $k => $v) {
                $sql .= " $k ";
                if($x<$count)
                    $sql .= ",";
                $x++;
            }
                $sql .= " ) SELECT ";
            $y=1;
            foreach ($params as $k => $v) {
                $sql .= " :$k ";
                if($y<$count)
                    $sql .= ",";
                $y++;
            }
                $sql .= " FROM DUAL WHERE NOT EXISTS( SELECT * FROM user u
                            WHERE u.email = :email AND u.planid = :planId )";


var_dump($sql);

//OUTPUT:

 INSERT INTO user ( planid , email , firstname , lastname  ) SELECT  :planid , :email , :firstname , :lastname FROM DUAL WHERE NOT EXISTS( SELECT * FROM user u WHERE u.email= :email AND u.planid = :planId)






$pdo = Database::getInstance();
$stmt = $pdo->prepare($sql);
$stmt->execute($data);


print_r($stmt);
//OUTPUT:

PDOStatement Object
(
    [queryString] => INSERT INTO user ( planid , email , firstname , lastname ) SELECT :planid , :email , :firstname , :lastname  FROM DUAL WHERE NOT EXISTS(SELECT * FROM user u
                                    WHERE u.email= :email AND u.planid = :planid)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...