【问题标题】:SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens - help neededSQLSTATE [HY093]:无效的参数号:绑定变量的数量与标记的数量不匹配 - 需要帮助
【发布时间】:2019-11-22 16:07:26
【问题描述】:

我尝试创建一个连接了数据库的网站,但我收到以下错误消息

INSERT INTO Diák (oktatási_id,  vezeték_név,  kereszt_név,  évfolyam,  születési_dátum,  város,  utca,  házszám,  irányítószám,  szak,  kar) 
         values (:oktatási_id, :vezeték_név, :kereszt_név, :évfolyam, :születési_dátum, :város, :utca, :házszám, :irányítószám, :szak, :kar)

SQLSTATE[HY093]:无效的参数号:绑定变量的数量 令牌数不匹配

这是我写在下面的 PHP 代码

<?php

require "../config.php";
require "../common.php";

if (isset($_POST['submit'])) {
  if (!hash_equals($_SESSION['csrf'], $_POST['csrf'])) die();

  try  {
    $connection = new PDO($dsn, $username, $password, $options);

    $new_user = array(
      "oktatási_id" => $_POST['oktatási_id'],
      "vezeték_név"  => $_POST['vezeték_név'],
      "kereszt_név"     => $_POST['kereszt_név'],
      "évfolyam"       => $_POST['évfolyam'],
      "születési_dátum" => $_POST['születési_dátum'],
      "város"  => $_POST['város'],
      "utca"  => $_POST['utca'],
      "házszám" => $_POST['házszám'],
      "irányítószám" => $_POST['irányítószám'],
      "szak" => $_POST['szak'],
      "kar" => $_POST['kar'],

    );

    $sql = sprintf(
      "INSERT INTO %s (%s) values (%s)",
      "Diák",
      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 escape($_POST['kereszt_név']); ?> adatát sikeresen hozzá adtuk az adatbázishoz.</blockquote>
  <?php endif; ?>

  <h2>Felhasználó hozzáadása az adatbázishoz</h2>

  <form method="post">
    <input name="csrf" type="hidden" value="<?php echo escape($_SESSION['csrf']); ?>">
    <label for="oktatási_id">oktatási_id</label>
    <input type="text" name="oktatási_id" id="oktatási_id">
    <label for="vezeték_név">Vezeték Név</label>
    <input type="text" name="vezeték_név" id="vezeték_név">
    <label for="kereszt_név">Kereszt Név</label>
    <input type="text" name="kereszt_név" id="kereszt_név">
    <label for="évfolyam">évfolyam</label>
    <input type="text" name="évfolyam" id="évfolyam">
    <label for="születési_dátum">Születési dátum</label>
    <input type="date" name="születési_dátum" id="születési_dátum">
    <label for="város">város</label>
    <input type="text" name="város" id="város">
    <label for="utca">utca</label>
    <input type="text" name="utca" id="utca">
    <label for="házszám">házszám</label>
    <input type="text" name="házszám" id="házszám">
    <label for="irányítószám">irányítószám</label>
    <input type="text" name="irányítószám" id="irányítószám">
    <label for="kar">kar</label>
    <input type="text" name="kar" id="kar">
    <label for="szak">szak</label>
    <input type="text" name="szak" id="szak">
    <input type="submit" name="submit" value="Submit">
  </form>

  <a href="index.php">Vissza a kezdő oldalra</a>

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

【问题讨论】:

  • 看起来您正在构建部分使用字符串操作的 SQL 语句,然后按摩此字符串。您应该在按摩这些字符串时将它们转储到控制台并检查它们,看看您是否在做出法律声明。因为该消息通常与格式错误的语句有关。简而言之:你需要做一些调试。
  • 请告诉我们var_dump($sql)和var_dump($new_user);的结果。

标签: php mysql sql database pdo


【解决方案1】:

我花了一段时间才找到,但我相信 PDO::prepare 通过正则表达式 [:][a-zA-Z0-9_]+ 传递命名参数。 https://github.com/php/php-src/blob/master/ext/pdo/pdo_sql_parser.re#L48。你的变音符号正在被破坏。

我知道的唯一替代方法是使用未命名的占位符 - ?。比如:

$sql = sprintf(
    "INSERT INTO %s (%s) values (%s)",
    "Diak",
    implode(", ", array_keys($new_user)),
    implode(', ', array_fill(0, sizeof($new_user), '?'))
);

这将产生:

INSERT INTO Diák (oktatási_id, vezeték_név, kereszt_név, évfolyam, születési_dátum, város, utca, házszám, irányítószám, szak, kar) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

然后您必须按如下方式更改您的执行方法:

$statement-&gt;execute(array_values($new_user));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-27
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    相关资源
    最近更新 更多