0

我有一个将数组中的所有数据插入到 MYSQL 的脚本。但是当数组中只有一个单词时,脚本不会出错,而当有多个单词时,它会给出一个

Column count doesn't match value count at row 1

这是我的代码

<?php
if($_SERVER['REQUEST_METHOD'] == 'POST') {
    include("connect.php");
    $counter = 0;
    $counters = 0;
    $string = mysql_real_escape_string($_POST['words']);
    $arr = explode(" ", $string);
    mysql_query("SET charset utf8");
    $sql = mysql_query("SELECT `word` FROM unicode WHERE word IN ('".implode("', '", $arr) . "')") or die (mysql_error());
    $dupes = array();
    while($r = mysql_fetch_assoc($sql)) {
        $dupes[] = $r['word'];
    }
    $newwords = array_diff($arr, $dupes);
    if(count($newwords)) {
        $word = implode("'),('", $newwords);
        $md5 = md5($word);
        $sqli = mysql_query("INSERT INTO unicode (word, word_hash) VALUES ('$word', '$md5')") or die (mysql_error());
    }
}
?>

请帮忙....

4

3 回答 3

1

INSERT查询中的列参数数量超过 2,但您只提供了 2 个值。

$word = implode("'),('", $newwords);

这句话是罪魁祸首。当您对$newwords数组进行内爆时,您可能会得到超过 2 个值。插入 MySQL 查询时,它与VALUES您提供的数量不匹配。这就是导致错误的原因。

于 2013-07-17T09:34:49.563 回答
1

通常,当我遇到 SQL 问题时,我会执行以下操作来追踪问题。

  1. 回显我试图针对数据库运行的 SQL 查询。这确保我传递的是变量的值,而不是文本“$variable”。

  2. 打开并检查 MySQL DB 中的 general.log 表(假设您使用的是 MySQL)。这将向您显示针对数据库运行的最后一个查询,并且如果您的脚本甚至对数据库执行任何操作,它将以一种或另一种方式证明。

最后,我并不像上面建议的那样对内爆等进行评论,但我也会添加以下内容。查看您的查询,您似乎正在执行我在第 1 点中谈到的内容。

$sqli = mysql_query("INSERT INTO unicode (word, word_hash) VALUES ('$word', '$md5')") or die (mysql_error());

$word 和 $md5 周围的单引号实际上意味着将 $word 和 $md5 传递到数据库中。在双引号“...”中使用变量时,您不需要在它们周围放置任何东西,只需按原样使用它们即可。或者,如果您想使用单引号,您可以连接查询字符串。

$sqli = mysql_query('INSERT INTO unicode (word, word_hash) VALUES ( ' . $word . ', ' . $md5 . ')') or die...

再次回显查询(没有 mysqli_query 函数)以确认。

希望这可以帮助。

小号

于 2013-07-17T09:58:20.453 回答
1

您正在 imploding $newwords,因此生成的查询将类似于:

...VALUES ('word1'),('word2'),('word3', 'md5 string')

添加$md5implode()

$md5 = 'md5 string';
$word = implode("', '$md5'),('", array('word1', 'word2', 'word3'));

输出:

...VALUES ('word1', 'md5 string'),('word2', 'md5 string'),('word3', 'md5 string')
于 2013-07-17T09:38:31.643 回答