HY:093参数号无效:参数未定义

时间:2019-05-25 03:10:03

标签: php html mysql sql

我不明白为什么会收到此错误

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 :(得分:0)

为什么查询构建如此复杂?可读性和可维护性通常比幻想更好。

$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();

我知道代码更长,但是比您现有的代码更易于阅读和维护恕我直言。