使用数组插入 MYSQL 时出现 PHP 错误

Posted

技术标签:

【中文标题】使用数组插入 MYSQL 时出现 PHP 错误【英文标题】:PHP error while inserting in MYSQL with arrays 【发布时间】:2013-07-15 18:54:27 【问题描述】:

我有一个将数组中的所有数据插入 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());
    

?>

请帮忙....

【问题讨论】:

你正在崩溃 $words 所以你最终会得到类似 VALUES ('word1'),('word2'),('word3') 的东西 【参考方案1】:

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

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

    打开电源并检查 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 函数)以确认。

希望这会有所帮助。

S

【讨论】:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ''),('ch'),('fgh, a1f3c00a8cb073d61cd6827189a118fe)' 附近使用正确的语法 你能通过将没有mysqli_query函数的$sqli回显到这个线程来添加完整的SQL语句吗? srry...实际上我是一个新手....你能告诉我在没有 mysql_query 的情况下回显 $sqli 的代码???thxx 提前 为变量赋值 $sqli = ("INSERT INTO unicode (word, word_hash) VALUES ('$word', '$md5')") 或 die (mysql_error()); - 回声 $sqli 。 ""; 您遇到过这个问题吗?【参考方案2】:

你正在内爆$newwords,所以生成的查询看起来像:

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

$md5 添加到implode()

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

输出:

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

【讨论】:

查看您当前的代码,您必须从 $word 计算 md5 指纹,然后再次 implode $newwords 以便 $md5 可以使用 对不起...我没明白...实际上我认为这是问题...但是我需要生成每个单词的 md5 并插入单词和 md5 .. .??提前谢谢...【参考方案3】:

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

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

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

【讨论】:

以上是关于使用数组插入 MYSQL 时出现 PHP 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 将数据插入 MySQL 数据库时出现问题

为啥插入子文档数组时出现“重复键错误”?

为啥插入子文档数组时出现“重复键错误”?

尝试插入长数组时出现 Postgresql 错误

php增加用户时出现的【SQLSTATE[HY000] [2002]

将行插入 MySQL 表时出现 pymysql.err.ProgrammingError 错误(使用 Python、Flask、ClearDB)