PHP+;mySQL在循环中插入许多行以表my php hungs/freases时/

PHP+;mySQL在循环中插入许多行以表my php hungs/freases时/,php,mysql,sql,xml,Php,Mysql,Sql,Xml,我在将循环中的行插入mySQL表时遇到了一些奇怪的问题。 让我先向您展示我使用的php代码,然后描述一些统计数据 我倾向于认为这是mySQL的问题,但绝对不知道是什么样的问题。每分钟表中的最大插入数?(无法达到最大行数-磁盘上spase的planty) echo " For character=" . $row[1]; $xml = simplexml_load_file($api_url); $i=0; foreach ($xml->result->rowset->row

我在将循环中的行插入mySQL表时遇到了一些奇怪的问题。 让我先向您展示我使用的php代码,然后描述一些统计数据

我倾向于认为这是mySQL的问题,但绝对不知道是什么样的问题。每分钟表中的最大插入数?(无法达到最大行数-磁盘上spase的planty)

echo " For character=" . $row[1];
$xml = simplexml_load_file($api_url);
$i=0;
foreach ($xml->result->rowset->row as $value) {
        $newQuery = 'INSERT INTO '.$tableName.' (transactionDateTime, quantity, typeName, price, clientName, station, transactionType, seller) VALUES ("'.$value['transactionDateTime'].'",'.$value['quantity'].',"'.$value['typeName'].'","'.$value['price'].'","'.$value['clientName'].'","'.$value['stationName'].'","'.$value['transactionType'].'","'.$row[1].'")';
        $i++;
        if (!mysqli_query($conn, $newQuery))    {
                die('Error while adding transaction record: ' . mysqli_error($conn));
        } // if END
} // foreach END
echo " added records=" . $i;
我有相同的XML数据,这些数据不会改变。(XML有大约1400多行我要插入)

  • 它总是插入不同数量的行。最大插入量约为800+
  • 如果我在$I==400处向foreach循环插入10秒延迟,它将添加更少的行。更多的延迟-更少的行
  • 它永远不会涉及到代码的
    mysqli\u错误($conn)
  • 它永远不会到达
    echo“added records=”$一,部分代码
因为它总是在不同的记录上停止,所以我必须假设INSERT查询没有任何错误。 因为它从未到达foreach循环
echo“added records=”之后的行$一,我还假设XML数据在最后没有被处理。
如果我使用另一个数据源(另一个字符),其中XML中的记录较少,那么这段代码就可以正常工作


我可能有什么问题

Scrowler是对的,您的php正在超时。作为测试,您可以添加

$db = new mysqli($hostname, $username, $password, $database);
    if($db->connect_errno > 0) 
    {
        $error[] = "Couldn't establish connection to the database.";
    }
$commaIncrement = 1;
$commaCount = count($result);
$SQL[] = "INSERT INTO $table $columns VALUES"; 
foreach ($result as $value)
{
    $comma = $commaCount == $commaIncrement ? "" : ",";
    $SQL[] = "(";
    $SQL[] =  "'$value[0]'"."'$value[1]'"."'$value[2]'"."'$value[3]'";
    $SQL[] = ")$comma";
    $commaIncrement++;
}
$SQL[] = ";";
$completedSQL = implode(' ',$SQL);
$query = $db->prepare($completedSQL);
if($query)
{
    $db->query($completedSQL)
}
$db->close();
到php脚本的开头


警告-请勿在生产或其他任何地方使用此功能。始终为脚本设置合理的时间限制。

可能是您在SQL server上触发多个查询。最好通过foreach构建一个SQL查询,然后触发一次

基本上是这样的:


您的PHP执行可能超时。浏览器停止加载通常需要多长时间?确实需要一些时间。比方说20秒左右。从API url获取XML可能会有问题,可能会给请求增加太多时间,并使脚本超时。对于Sebas来说,这个循环实际上需要一些时间。没有做任何percise计数,但是可能需要20秒或者更多。对于Joel来说,XML马上就来了,然后我就解析它。换句话说,我相信使用XML不会花那么长时间。我想我使用的方法不是最好的,也许有更可靠的方法。但到目前为止我所做的是:我添加了set_time_limit(0);正如你所说,这还没有帮助。然后,我通过删除带有列顺序的括号简化了查询,无论如何,我都是按列顺序提供数据的。这很有帮助——脚本现在可以工作了。但我知道这个问题仍然存在,需要稍后再讨论。也许可以把它缩小到更小的数据集,并对它进行具体计时。如果是mysql连接造成了延迟,那么您可能有点问题。我知道,在一些系统安装中,他们在解析localhost而不是127.0.0.1时遇到问题,这会给每个数据库连接增加额外的一秒钟。您可以通过查看进入主机上的mysql控制台的速度来进行测试。如果它是快速和简单的,您现有的配置是好的。如果加载需要一整秒钟(或更长时间),那就是你的问题。您还可以添加一个标志,以便知道何时收到xml并开始插入。这是一种非常有趣的编码方式。我想我将不得不研究它,也许还需要加以利用。虽然我对mySQL没有很好的了解,但我认为一次插入一千个可能太多了?可能按例如100对插入进行分组已经足够好了?@RoyHaskell是正确的-用1000条语句进行一次查询比用一条语句进行1000次查询更好@用户2997497如果您想将其分解,可以使用
for
循环创建单独的查询。
$db = new mysqli($hostname, $username, $password, $database);
    if($db->connect_errno > 0) 
    {
        $error[] = "Couldn't establish connection to the database.";
    }
$commaIncrement = 1;
$commaCount = count($result);
$SQL[] = "INSERT INTO $table $columns VALUES"; 
foreach ($result as $value)
{
    $comma = $commaCount == $commaIncrement ? "" : ",";
    $SQL[] = "(";
    $SQL[] =  "'$value[0]'"."'$value[1]'"."'$value[2]'"."'$value[3]'";
    $SQL[] = ")$comma";
    $commaIncrement++;
}
$SQL[] = ";";
$completedSQL = implode(' ',$SQL);
$query = $db->prepare($completedSQL);
if($query)
{
    $db->query($completedSQL)
}
$db->close();