-1

我正在尝试从 api 循环数据,然后将这些值发布到 MySQL db。

像这样的东西:

$values = json_decode(file_get_contents("my-json-file"));

$SQL = new mysqli(SQL_HOST, SQL_USER, SQL_PASS, DB_NAME);
$SQL->autocommit(FALSE);

foreach($values As $item)
{
    $query = "INSERT INTO my_table VALUES ('".$item->value1."', '".$item->value2.";)";
    $SQL->query($query);
    if(!$SQL->commit())
    {
        echo "ERROR ON INSERT: [" . $query . "]<hr/>";
    }
}
$SQL->close();

由于循环太快,SQL 赶不上。(是的!)然后我需要这样的东西:

foreach($values As $item)
{
    /**** STOP/PAUSE LOOP ****/

    $query = "INSERT INTO my_table VALUES ('".$item->value1."', '".$item->value2.";");
    $SQL->query($query);
    if($SQL->commit())
    {
        /**** START THE LOOP AGAIN ****/
    }
    else
    {
        echo "ERROR ON INSERT: [" . $query . "]<hr/>";
    }
}

或者我应该如何以正确的方式做到这一点?

编辑:它每次都会插入随机帖子。

编辑 2:这只是示例代码。它确实逃脱了所有这些,是的,分号在这里是错误的,但是由于有很多评论,我不会改变它。这不是真实案例中的问题。我试图在另一台服务器上运行它并且它在那里工作。该问题已通过重新启动 MAMP 得到解决。

4

4 回答 4

2

首先,您认为循环运行得太快以至于 MySQL 跟不上的想法是完全错误的。该$SQL->query()调用将在继续之前等待 MySQL 返回响应,因此循环运行的速度不会比 MySQL 响应的速度快。

现在到实际问题....您的查询:

$query = "INSERT INTO my_table VALUES ('".$item->value1."', '".$item->value2.";)";

末尾有一个分号,后面value2是无效的。我猜你打算在那里输入引号?分号将导致您的所有查询失败并引发错误。

这可能是您的问题的原因,但您没有在那里检查任何错误,所以您不会知道。调用查询后向您的代码添加一些错误检查;即使查询是正确的,仍然可能出现错误,您的代码应该检查它们。请参阅本手册页上的示例:http ://www.php.net/manual/en/mysqli-stmt.error.php

最后,由于您使用的是 mysqli API,因此值得一提的是,如果您使用准备好的语句,您的代码会更好,并且可能更安全。在此处查看 PHP 手册中的示例:http ://www.php.net/manual/en/mysqli-stmt.bind-param.php

[编辑]

您的查询失败的另一个可能原因是您没有转义输入值。如果任何输入值包含引号字符(或任何其他在 SQL 中非法的字符),则查询将失败。此外,此问题使您的代码容易受到 SQL 注入黑客攻击。

您需要$SQL->real_escape_string()通过将查询更改为使用准备好的语句(如上所述)来使用 OR 转义您的输入。

于 2013-02-07T14:27:34.243 回答
1

您的查询在循环内,这意味着循环将等到您的查询完成执行后再继续,php代码按顺序处理...

于 2013-02-07T14:10:35.150 回答
0

@phpalix 说过,PHP 按顺序进行,并等待上一个操作完成。

我认为你的 SQL 是错误的。尝试用这个替换你的 INSERT:

$query = "INSERT INTO my_table VALUES ('".$item->value1."', '".$item->value2."');";

并且不要忘记为每个变量至少运行mysql_real_escape_string以采取安全措施。

于 2013-02-07T14:29:57.690 回答
0

正如许多答案和评论所说,在 SQL 完成之前它不会继续。问题出在我的本地 apache/mysql 服务器上。通过重新启动它已修复。是的,愚蠢的帖子。

于 2013-02-07T14:40:56.537 回答