【问题标题】:php - Can't insert array into MySQLphp - 无法将数组插入 MySQL
【发布时间】:2011-08-04 09:33:39
【问题描述】:
if ($response_array[0] == 1) {
    $table = payments_received;
    function mysql_insert_array($table, $response_array) {
    foreach ($response_array as $field=>$value) {
        $fields[] = '`' . $field . '`';
        $values[] = "'" . mysql_real_escape_string($value) . "'";
    }
    $field_list = implode(',', $fields);
    $value_list = implode(', ', $values);

    $query = "INSERT INTO `" . $table . "` (" . $field_list . ") VALUES (" . $value_list . ")";
        if (!$query) { 
        $message = mysql_error();
        die($message);
    }
    }

    include('receipt.php');
}

任何想法为什么这不起作用?我知道顶部的条件得到满足,因为脚本继续包含receipt.php(代码底部)。我知道 $response_array 也因此有数据(另外我在收据中使用了它的数据)。尽管有 $query 下的条件,但我根本没有得到任何错误输出(顺便说一下,我的 MySQL 连接信息是在脚本顶部指定的,包括处于完美工作状态的 config.inc.php)。我希望我没有遗漏一些明显的东西。


更新 #1:

正如你们中的一些人指出的那样,我实际上并没有调用 mysql_query(因为我担心我错过了一些明显的东西,这表明我的大脑没有在高水平上运作)。我接受了 Gus 的编辑并尝试了它们,修复了不平衡的大括号并添加了 mysql_query() (正如弗兰克提到的)。这是我所拥有的:


function mysql_insert_array($table, $response_array) {
    foreach ($response_array as $field=>$value) {
    $fields[] = '' . $field . '';
    $values[] = "'" . mysql_real_escape_string($value) . "'";
    }
    $field_list = implode(',', $fields);
    $value_list = implode(', ', $values);

$field_list = rtrim($fieldlist,",");
$value_list = rtrim($value_list,",");

$query = mysql_query("INSERT INTO `" . $table . "` (" . $field_list . ") VALUES (" . $value_list . ")");
if (!$query) { 
$message = mysql_error();
die($message);
}

}

if ($response_array[0] == 1) { $table = "payments_received"; mysql_insert_array($table, $response_array); include('receipt.php'); } else { include('declined.php'); }

我更进一步,至少得到一个错误代码,这是......

您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在 '0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 附近使用的正确语法, 16,17,18,19,20,21,22,23,24,25,26,27,28,29,' 在第 1 行

...我知道问题出在尾随逗号,但我今天一直遇到这个问题,还没有弄清楚如何在这种情况下摆脱那个该死的额外逗号。想法?

感谢大家迄今为止的帮助。


更新 #2

回答了我自己的问题。我使用 rtrim($field_list,",") 和 rtrim($value_list,",") 取得了成功。请参阅 UPDATE #1 中的代码更新......或者不!我刚刚意识到,当我粘贴上面的代码时,我打错了并且在一个地方忘记了 field_list 中的下划线......我将它添加回来并再次测试,它没有工作。与上述错误相同。但是,当拼写错误仍然存​​在时,代码可以正常工作并且完全符合我的要求。 WTF!?


最终更新

我用下面的代码做了我想做的事。我在下面代码的第 3 行的 $field 周围添加了 `(我不知道那个字符叫什么)。


function mysql_insert_array($table, $response_array) {
    foreach ($response_array as $field=>$value) {
    $fields[] = "$field";
    $values[] = "'" . mysql_real_escape_string($value) . "'";
    }
    $field_list = implode(',', $fields);
    $value_list = implode(', ', $values);

$field_list = rtrim($field_list,",");
echo "$field_list <br />";
$value_list = rtrim($value_list,",");
echo "$value_list <br />";

$query = mysql_query("INSERT INTO `" . $table . "` ($field_list) VALUES (" . $value_list . ")");
if (!$query) { 
$message = mysql_error();
die($message);
}

}

if ($response_array[0] == 1) { $table = "payments_received"; mysql_insert_array($table, $response_array); include('receipt.php'); } else { include('declined.php'); }

【问题讨论】:

  • 我已经更新了我的回复。看看吧。
  • @Kerin 谢谢。我也对我的问题进行了另一次更新。
  • 没有看到你的代码的其余部分,我不得不冒险猜测你删除下划线的 rtrim 函数在提供未定义的值时行为不可预测。这不是一个真正的猜测,我对此并不满意,但我会在早上再看一次。此外,我注意到在您的 implode() 函数中,您使用 ',' 作为第一个 implode 的分隔符,并使用 ', ' 作为第二个 implode 的分隔符。第三,我想补充一点,整个 rtrim 事情很奇怪且不必要,只需使用 '' 作为分隔符执行 implode(),您将获得即时连接的字符串!

标签: php mysql arrays


【解决方案1】:

你还没有真正执行过 $query,比如 mysql_query($query);

:)

Ryan 也可能是对的,但这就是您的查询无法正常工作的具体原因 - 就 PHP 而言,您已经构建了查询,然后没有费心用它做任何有成效的事情。


编辑 1:弗兰克?!男人,表达爱的方式。 :)

但我开玩笑的。你可以做几件事;要么使用 substr() 将尾随逗号剪掉,然后附加一个 ;用正常的字符串连接代替它,或者将您的 do while 循环切换为 for () 循环并添加一个 if 子句,选择性地删除“,”或“;” in 基于你的计数器是否等于源数组的大小减一。

我会亲自做substr。

【讨论】:

  • 哦,RYAN 是对的,但没有其他人提到它,是吗? ;) 你和你“你必须实际执行查询” - 呃。也许他不想执行查询——也许他只是想写一个漂亮的查询,这样我们就可以欣赏它了。
  • 我这么说的时候没有其他人提到过!我的意思是,我看到了。要么,要么我是一个可恨的混蛋。问我的妻子。
  • @Dave 我在 21 秒前抓住了你,公平公正!
  • 我受不了这一切的战斗妈妈爸爸请停止它
  • @Ryan - 21 秒后 1 次否决票,我离开了岛。 :)
【解决方案2】:

这是你的问题:

$table = payments_received;

PHP 正在寻找一个名为 payments_received 的文字;你的意思可能是:

$table = "payments_received";

【讨论】:

  • 这只会在我的机器上引起 PHP 通知——该语言假定 payments_received 的预期值为 "payments_received"
  • 另外,正如 Kerin 所指出的,他实际上并没有执行查询!每个问题本身就足以阻止实际插入数据
  • @Hans 很好奇!感谢您指出了这一点。好吧,只要他不在文字中使用空格,我想他就没事:)
  • 不过,它是 PHP 的一种语言“特性”,可能不应该依赖 :)
  • 最令人惊讶的部分是错误只是通知级别
【解决方案3】:

第一个问题是

$table = payments_received;

应该是

$table = "payments_received";

下一个改进可以是:

"INSERT INTO `" . $table . "` ("

应该是

"INSERT INTO `$table` ("

导致你需要执行的点

$result = mysql_query($query)

【讨论】:

  • 第二点不是问题,因为他们会评估同样的事情。正如 Kerin 指出的那样,真正的问题是他实际上并没有执行查询
  • 你的“下一个问题”不是问题。他写的方式有什么问题?实际上我更喜欢他的方式,因为他没有将变量放入字符串中。
  • @Ryan 在您输入时更新。
【解决方案4】:

您犯了两个主要错误:您忘记在第二行添加“”是小错误,主要错误是您从未真正执行过该功能。您必须先定义函数,然后才能在if() 语句中执行它。

希望这对你有用:

function mysql_insert_array($table, $response_array) {
    foreach ($response_array as $field=>$value) {
    $fields[] = '' . $field . '';
    $values[] = "'" . mysql_real_escape_string($value) . "'";
    }
    $field_list = implode(',', $fields);
    $value_list = implode(', ', $values);


    $query = "INSERT INTO `" . $table . "` (" . $field_list . ") VALUES (" . $value_list . ")";
    if (!$query) { 
    $message = mysql_error();
    die($message);
}

if ($response_array[0] == 1) {
    $table = "payments_received";
    mysql_insert_array($table, $response_array);
}

include('receipt.php');

【讨论】:

  • 你也忘了他从来没有执行过查询:x
  • 你是对的,他声明了 mysql_insert_array() 并且从不调用它(迄今为止的其他答案都错过了),但是你忘记调用 mysql_query,并且你有不平衡的花括号,所以你的代码距离工作还有一些调整。
  • 感谢 Gus、Ryan 和 Frank。我做了一些修改,但仍然有问题。请参阅问题中的更新 #1。
猜你喜欢
  • 2011-11-10
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多