我正在尝试使用mysqli预处理语句将值插入到我的数据库中。问题是我收到错误Prepare failed: (1136) Column count doesn't match value count at row 1
。如果我添加一个问号,我会修复该错误,但我再次提出另一个问题Binding parameters failed: (0) #3 Execute failed: (2031) No data supplied for parameters in prepared statement
。
我的数据库结构如下所示:http://cl.ly/image/2x3i162V290L,我的PHP看起来像这样:
<?php
include 'db_connect.php';
include 'functions.php';
sec_session_start();
$name = $_POST['name'];
$artist = $_POST['artist'];
$url = $_POST['url'];
$lyrics = $_POST['lyrics'];
$lyrtime = "";
if (!($stmt = $mysqli->prepare("INSERT INTO song VALUES (?,?,?,?,?,?,?)"))) {
echo "#1 Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
/* Prepared statement, stage 2: bind and execute */
if (!$stmt->bind_param("isssss", $_SESSION['user_id'], $name, $artist, $url, $lyrics, $lyrtime)) {
echo "#2 Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
if (!$stmt->execute()) {
echo "#3 Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
/* explicit close recommended */
$stmt->close();
?>
为什么这不起作用?
答案 0 :(得分:2)
VALUES (?,?,?,?,?,?,?)
^^^^^^^^^^^^^---- 7 placeholders
bind_param("isssss",
^^^^^^--- 6 placeholders
确实错误消息告诉您的内容。
答案 1 :(得分:2)
您需要声明您正在设置的字段
"INSERT INTO song VALUES (?,?,?,?,?,?)"
应该是
"INSERT INTO song (userid, name, artist, lyric, url, lyrtime)VALUES (?,?,?,?,?,?)"
否则第一个?假设是id,而不是使用 如果您不首先声明字段,则自动递增的值。 (只有6'?'而不是7'
您还需要删除一个绑定参数,因为您没有传递id PK
/* Prepared statement, stage 2: bind and execute */
if (!$stmt->bind_param("issss", $_SESSION['user_id'],
$name, $artist, $url, $lyrics,$lyrtime)) {
echo "#2 Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
答案 2 :(得分:0)
也许你忘记了主键。您可以使用
之类的查询Insert INTO TABLE(COL1, COL2) VALUES(1,2)
没有主键。在这种情况下你的表TABLE(PRIM_COL,COL1,COL2)。 或者您需要将null放在必须为主键的位置。
$stmt = $mysqli->prepare("INSERT INTO song VALUES (null,?,?,?,?,?,?)")
答案 3 :(得分:0)