Mysqli自动递增值不起作用

时间:2014-04-17 16:09:05

标签: php mysql sql mysqli

我正在尝试使用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();

?>

为什么这不起作用?

4 个答案:

答案 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)