Почему я не могу использовать execute () для массива?

#php #arrays #execute

#php #массивы #выполнить

Вопрос:

Я пытаюсь внедрить процесс проверки электронной почты на свой веб-сайт, но я получил ошибку

Неустранимая ошибка: неперехваченная ошибка: Вызов функции-члена execute() в bool в: 56 Трассировка стека: #0 {main}, введенный в строку 56

Вот мой код:

       $user_activation_code = md5(rand());

  // Nuevo Usuario
  $hashed = password_hash($password,PASSWORD_DEFAULT);
  $insert_query = 'INSERT INTO clientes (full_name,email,user_activation_code,user_email_status,password,permissions,street,numero,interior,city,state,zip_code,country) VALUES ("$name","$email","$user_activation_code",:user_email_status,"$hashed",cliente,"$street","$numero","$interior","$city","$state","$zip_code",Mexico)';
  $statement = $db->prepare($insert_query);
  $statement -> execute(
    array(
      'full_name'            => $_POST['name'],
      'email'                => $_POST['email'],
      'password'             => $hashed,
      'user_activation_code' => $user_activation_code,
      ':user_email_status'    => 'no verificado'
    )
  );
  $result = $statement->fetchAll();
  

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

1. Ваш запрос не удался, используйте отчет об ошибках, чтобы узнать причину. Массив допустим с PDO, так что это не проблема. Все значения должны быть привязаны, а не только некоторые из них. Я бы предположил, Mexico что это ваша текущая проблема, хотя

2. Если вы собираетесь подготовить свой оператор, вы могли бы также связать все параметры. Это избавит вас от головной боли в будущем.

3. Глядя на это снова, я думаю, что вы ошибаетесь. У вас нет password заполнителя. "$hashed" должно быть :password в вашем запросе (в values() части).

4. Вы не создаете записи массива для имен ваших столбцов, вы создаете их для имен ваших привязок. Т.е. вы пытаетесь привязать full_name , email , password и user_activation_code , но у вас нет :full_name , :email :password , :user_activation_code , или в вашем запросе.

5. Итак … ваш prepare сбой.

Ответ №1:

Вам нужно правильно привязать свой массив к запросу.

PDO для использования ассоциативного массива вам необходимо иметь значения как в строке запроса, так и те же значения в вашем ключе.

 $insert_query = 'INSERT INTO clientes (full_name,email,user_activation_code,user_email_status,password,permissions,street,numero,interior,city,state,zip_code,country) VALUES (:full_name,:email,:user_activation_code,:user_email_status,:password,"cliente","$street","$numero","$interior","$city","$state","$zip_code","Mexico")';
array(
  ':full_name'            => $_POST['name'],
  ':email'                => $_POST['email'],
  ':password'             => $hashed,
  ':user_activation_code' => $user_activation_code,
  ':user_email_status'    => 'no verificado'
)
  

Пожалуйста, также привяжите другие ваши значения, такие как: $city, $ state и т.д.

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

1. Вы помещаете заполнители bind в список столбцов, они должны быть в списке значений.

2. @AlexHowansky хороший улов

3. Mexico и cliente вероятно, все равно вызовет проблемы, и действительно, все значения должны быть привязаны. Любой может содержать кавычку, и это снова приведет к разрыву.