我正在尝试从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解决了这个问题。
答案 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服务器上。它通过重新启动来修复。是的,愚蠢的帖子。