php - 循环连接时出现太多连接错误

标签 php mysql csv pdo

我尝试通过 PHP 加载 csv 文件,我的 csv 文件有很多记录 (300)。当加载 csv 文件过程时,它只上传 25 行然后 PDO 错误出现“连接太多”。有什么方法可以加快插入过程吗?

while(($emapData = fgetcsv($file, 10000, ",")) !== FALSE){    
   try{    
      $dbcon = new PDO("mysql:host=$servername;dbname=$dbname",$username,$password);    
      $dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    
      $stmt = $dbcon->prepare("INSERT INTO Growth(id, date, stage, length, width) VALUES(nullif('$emapData[0]','NULL'), nullif('$emapData[1]','NULL'), nullif('$emapData[2]','NULL'), nullif('$emapData[3]','NULL'), nullif('$emapData[4]','NULL')");
      $stmt->execute();
   }
   catch(PDOException $e){
      echo "Error: " . $e->getMessage();
   }
}

最佳答案

Stack Overflow 被许多人视为一种服务,可以快速解决手头的紧迫问题。

不幸的是,它也是可重用代码示例的来源。当您从这样的角度看这个网站时,您会发现大多数答案令人震惊,因为它们制造的问题多于解决的问题。

以这篇文章为例。 OP 中的代码在许多 级别上是错误的,本质上是滥用准备好的语句,放弃了它的所有 好处。好吧,其实没关系,因为我们都在学习。但答案是将所有问题原封不动,专注于一个特定的问题。因此,我们有一个被社区批准的代码示例,实际上,极其有害。好吧,我有一些告诉错误代码的经验。但是来自 Google 的毫无戒心的访问者不会。并且会简单地复制并粘贴提供的解决方案。连同它的所有弱点和低效率。

在循环中运行准备好的语句:

  • 当然应该在循环之前建立连接
    • 此外,所有连接代码都必须移出循环,而不仅仅是循环的一部分
    • 此外,它必须是正确的连接代码,具有所有必需的选项,因此以后不会引入新的问题(例如由错误的charset引起)
  • 准备好的语句应该是实际准备好的语句,而不是模仿。 查询中的所有变量都必须用占位符替换以使这个准备好的语句真正做任何有用的事情——首先防止SQL注入(inject)
  • prepare() 调用也必须移出循环。这就是这种声明的重点 - 准备一次,执行多次。
  • 错误处理代码必须安全且灵活。而 回显“错误:”。 $e->getMessage(); 比它更重要。

所以正确的例子是:

include 'pdo.php';
$sql = "INSERT INTO Growth(id, date, stage, length, width)
VALUES(nullif(?,'NULL'), nullif(?,'NULL'), nullif(?,'NULL'), nullif(?,'NULL'), nullif(?,'NULL')")
$stmt = $dbcon->prepare($sql);
while(($emapData = fgetcsv($file, 10000, ",")) !== FALSE){    
    $stmt->execute($emapData);
}

这段代码中做了两个假设:

  • pdo.php 文件包含一个 correct PDO connection code因为不是在每个文件中连接,连接代码必须移动到一个单独的文件中,然后只包含在每个需要数据库连接的脚本中
  • csv 文件中的列数等于表格中的行数。否则,必须事先在 $emapData 上调用 array_slice() 函数

关于php - 循环连接时出现太多连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58405172/

相关文章:

php - BinaryFileResponse 上的 session 丢弃安全 token

php - Laravel 5.6-禁用错误

mysql - `from_unixtime` 能否减慢此查询速度?

json - 使用 Golang 将 CSV 转换为 JSON - 在 Web 浏览器中打印时会跳过一些数据

python - 将抓取的 json 文件读取到 python 中

php - 发现 fatal error : While Transfering website One server to another Server

java - 类之间的关系

mysql - 乘坐{

mysql - SQL命令根据插入的数据自动创建表

csv - 是否可以查看带有列填充的 csv 和 tsv 文件,以便列很好地对齐?