gpt4 book ai didi

PHP 正则表达式和 CSV 验证

转载 作者:行者123 更新时间:2023-11-29 12:07:27 25 4
gpt4 key购买 nike

我正在尝试创建一个 CSV 检查器,它将检查的数据插入到数据库中,并将任何不成功的数据添加到 .txt 文件中。我试图使用正则表达式来验证我插入的数据,没有任何验证的 while 循环可以正常工作并且插入正常,但一旦使用正则表达式,它就不起作用。

<?php
include_once('connection.php');
error_reporting(E_ALL);
date_default_timezone_set('Europe/London');
$date = date('d/m/y h:i:s a', time());
$filetxt = "./errors.txt";
$errors = array();
$var1 = 5;
$var2 = 1000;
$var3 = 10;
$sql = '';

if(isset($_POST["Import"]))
{
echo $filename=$_FILES["file"]["tmp_name"];
if($_FILES["file"]["size"] > 0)
{
$file = fopen($filename, "r");
while(($emapData = fgetcsv($file, 10000, ",")) !==FALSE)
{
if(isset($_GET['strProductCode']))
{
$emapData[0] = $conn->real_escape_string(trim($_POST['strProductCode']));

if (!preg_match("^[a-zA-Z0-9]+$^", $_POST['strProductCode']))
{
$errors['strProductCode'];
}
}
if(isset($_GET['strProductName']))
{
$emapData[1] = $conn->real_escape_string(trim($_GET['strProductName']));
if (!preg_match("^[a-zA-Z0-9]+$^", $_POST['strProductName']))
{
$errors['strProductName'];
}
}
if(isset($_GET['strProductDesc']))
{
$emapData[2] = $conn->real_escape_string(trim($_GET['strProductDesc']));
if (!preg_match("^[a-zA-Z0-9]+$^", $_POST['strProductDesc']))
{
$errors['strProductDesc'];
}
}
if(isset($_GET['intStock']))
{
if (!preg_match("^[0-9]", $_POST['intStock']))
{
$errors['intStock'];
}
}
if(isset($_GET['intPrice']))
{
if (!preg_match("[0-9]", $_POST['intPrice']))
{
$errors['intPrice'];
}
}
if(isset($_GET['dtmDiscontinued'])){
if($emapData[6] == preg_match("[a-zA-Z]", $_POST['dtmDiscontinued']))
{

$emapData[6] = $date;
echo $date;
}else{
$emapData[6] = Null;
}
}
if(count($errors > 0))
{
// errors
$write = "$emapData[0], $emapData[1], $emapData[2], $emapData[3], $emapData[4], $emapData[5], $emapData[6]\r\n";
file_put_contents($filetxt , $write , FILE_APPEND);

}else{
// insert into Database
$sql = "INSERT INTO tblproductdata(strProductCode, strProductName, strProductDesc, intStock, intPrice, dtmAdded, dtmDiscontinued) VALUES('$emapData[0]','$emapData[1]','$emapData[2]','$emapData[3]','$emapData[4]','$date','$emapData[6]')";
$res=$conn->query($sql);
}

}
fclose($file);
echo "CSV File has successfully been Imported";
echo "<br>";
echo "Any errors within the CVS Database are reported here.";
echo "<br>";
$fh = fopen($filetxt, 'r');
$theData = fread($fh, filesize($filetxt));
fclose($fh);
echo $theData;

}else{
echo "Invalid File: Please Upload a Valid CSV File";
}
header("Location: index.php");
}
?>

我对 PHP 的了解不是很多,但这是我最好的尝试。任何帮助将不胜感激。

最佳答案

您的代码中有几个问题。让我们从正则表达式和错误检查开始:

  1. 您的某些表达方式无效。请注意,每个表达式在表达式的开头和结尾都需要一个分隔符。在您的某些表达式(例如 ^[0-9] )中,缺少这些分隔符。另请注意,使用 ^作为正则表达式的分隔符不是一个好的选择,因为 ^字符在正则表达式中也有特殊含义。

    这实际上应该导致 PHP 警告。我看到你有error_reporting已启用;您还应该看看您的 display_errors设置。

  2. 正如我的评论中提到的,您没有为 $errors 分配任何值。大批。声明$errors['strProductName']本身并不改变数组;这意味着 $errors将永远是空的。您可能想做类似的事情:

    $errors['strProductName'] = TRUE;
  3. 您实际上正在检查 count($errors > 0)你应该在哪里检查count($errors > 0)count($errors > 0)翻译为 count(TRUE)count(FALSE)两者都等于 1。

其他一些注意事项:

  • 有时,您会检查 $_GET['strProductCode'] ,然后使用 $_POST['strProductCode'] .
  • 您没有重置 $errors每次迭代的数组。这意味着对于您阅读的每一行,$errors变量仍将包含上一次迭代的错误。因此,第一个无效行也会导致所有后续行被识别为无效。
  • 当其中一个参数的格式无效时,您会注册一个错误,但当其中一个参数根本未设置时(即,当 isset($_POST[...])FALSE 时),您不会注册错误。他们每个人都应该是……。像这样:

    if (isset($_POST['strProductCode'])) {
    $emapData[0] = $conn->real_escape_string(trim($_POST['strProductCode']));
    if (!preg_match("^[a-zA-Z0-9]+$^", $_POST['strProductCode'])) {
    $errors['strProductCode'] = TRUE;
    }
    } else {
    $errors['strProductCode'] = TRUE;
    }
  • 关于PHP 正则表达式和 CSV 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31235075/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com