HY: 093 Неверный номер параметра: параметр не был определен - PullRequest
1 голос
/ 25 мая 2019

Я не понимаю, почему я получаю эту ошибку

if (isset($_POST['submit'])) {
    require "../config.php";
    require "../common.php";
    try  {
        $connection = new PDO($dsn, $username, $password, $options);

        $new_user = array(
            "Nom"  => $_POST['Nom'],
            "EmailID"     => $_POST['EmailID'],

            "localité"  => $_POST['localité']
        );
        $sql = sprintf(
                "INSERT INTO %s (%s) values (%s)",
                "memfis",
                implode(", ", array_keys($new_user)),
                ":" . implode(", :", array_keys($new_user))
        );

        $statement = $connection->prepare($sql);
        $statement->execute($new_user);
    } catch(PDOException $error) {
        echo $sql . "<br>" . $error->getMessage();
    }
}
?>

<?php require "templates/header.php"; ?>

<?php if (isset($_POST['submit']) && $statement) { ?>
    <blockquote><?php echo $_POST['name']; ?> successfully added.</blockquote>
<?php } ?>

Если только добавили пользователя и отобразили «Nom успешно добавлено», следует добавить Nom и другие поля.

1 Ответ

0 голосов
/ 25 мая 2019

Почему так сложно построить запрос? Как правило, лучше читать и поддерживать, чем фантазировать.

$sql = sprintf(
        "INSERT INTO %s (%s) values (%s)",
        "memfis",
        implode(", ", array_keys($new_user)),
        ":" . implode(", :", array_keys($new_user))
);

Возможно, попробуйте изменить это на что-то вроде:

$table = "memfis";
$columnNames = implode(", ", array_keys($new_user));
$columnPlaceholders = ":" . implode(", :", array_keys($new_user));
$sql = "INSERT INTO $table ($columnNames) VALUES ($columnPlaceholders)";

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

И затем, поскольку ваш запрос будет содержать такие элементы, как :Nom, в качестве заполнителей, вам нужно использовать bindParam().

foreach (array_keys($new_user) as $key) {
    $placeholder = ":" . $key;
    $stmt->bindParam($placeholder, $new_user[$key]);
}

$stmt->execute();

Я знаю, что код длиннее, но ИМХО легче читать и поддерживать, чем то, что у вас есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...