暂停foreach并继续

时间:2013-02-07 14:07:45

标签: php mysql loops foreach mysqli

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

类似的东西:

$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 个答案:

答案 0 :(得分: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()或通过更改查询来使用预准备语句(如上所述)来转义输入。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

有@phpalix说,PHP按顺序进行,等待上一步完成。

我认为你的SQL错了。尝试用以下内容替换INSERT:

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

为了安全措施,不要忘记为每个变量运行至少 mysql_real_escape_string

答案 3 :(得分:0)

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