我得到一个包含MySQL插入的文本文件(.sql)。我发现有时会包含空行。这些空白行包含十六进制值0D0A (Windows换行符)。当为查询发送空行时,MySQL会报告错误。因此,当我读取/发送行到MySQL时,我想跳过发送任何空行。我想出了以下代码,但它并没有像我预期的那样工作。将删除换行符,但仍会将空行发送到MySQL。我将问题追溯到PHP命令empty()。根据文件“”应该被认为是空的。那么为什么它不跳过空行呢?我已经在这上面花了几天的时间,但我尝试的都不起作用。我需要另一双眼睛,谢谢。代码如下:
<?php
$bom = pack("H*", "EFBBBF");
if(($reading = fopen("sample.sql", "r")) !== false)
{
$sql = preg_replace("/^$bom/", "", fgets($reading));
while(!feof($reading))
{
$sql = str_replace(array("\n", "\r", "\r\n"), " ", $sql);
if(!empty($sql))
{
echo("{$sql}<br>");
$sql = fgets($reading);
}
}
if(!feof($reading))
{
echo("Unexpected read error in file." . PHP_EOL);
}
fclose($reading);
}
?>我将换行符替换为空格(如果我尝试使用"“删除换行符,IIS将崩溃)。我希望空命令跳过空格,但它没有。运行此脚本所需的示例数据是here。
感谢你的帮助,
查尔斯
发布于 2020-11-13 16:57:23
经过一些非常需要的睡眠后,我发现了我的问题(某种程度上)。我仍然认为empty()应该看到“”为空,我会再次检查文档。
要修复我的代码,我必须更改str_replace以完全删除换行符。然后,我必须将fget移出if语句(如果该行为空,则仍然需要获取下一行)。
如果其他人遇到这个问题,这里是更正后的代码:
<?php
$bom = pack("H*", "EFBBBF");
if(($reading = fopen("sample.sql", "r")) !== false)
{
$sql = preg_replace("/^$bom/", "", fgets($reading));
while(!feof($reading))
{
$sql = str_replace(array("\r\n", "\n", "\r"), "", $sql);
if(!empty($sql))
{
echo("{$sql}<br>");
}
$sql = fgets($reading);
}
if(!feof($reading))
{
echo("Unexpected read error in file." . PHP_EOL);
}
fclose($reading);
}
?>谢谢你的关注。
https://stackoverflow.com/questions/64814526
复制相似问题