【问题标题】:How to replace single quote by two in php in a csv file with str_replace?如何用str_replace在csv文件中用两个替换单引号?
【发布时间】:2020-12-26 17:20:30
【问题描述】:

我有一个 PHP 脚本,它允许我将 CSV 文件中的数据插入到 SQL Server 表中。

我在某些方面有这样的例子:

CL2096-CL;CREATURES OF LEASURE;h - Wetsuits;hd - Wetsuits Accessories;9'6" LONGBOARD DOUBLE;ETE 2020
CTEQJ5-RC;RIP CURL;c - Surfwear;ca - Surfwear Men;D'AMS S/S TEE;WINTER 2020/2021
BBBCJ1-RC;RIP CURL;b - Men Accessories;ba - Bags Men;DAY COVER 6'3;ETE 2020
BBBCK1-RC;RIP CURL;b - Men Accessories;ba - Bags Men;DAY COVER 6'7;ETE 2020
BBBCF1-RC;RIP CURL;b - Men Accessories;ba - Bags Men;DAY COVER 6'0;WINTER 2020/2021

我想将文件中的' 替换为'' 以便能够插入它们。我尝试了str_replace,但替换不起作用,我的错误可能是什么原因造成的?

<?php
    
    include("connexion.php");
    
    $dir   = '//macaroni/d$/ftp/Y2/GET/';
    $allFiles = scandir($dir);
    $dest = '//macaroni/d$/ftp/Y2/GET/COPIES/';
    
    foreach($allFiles as $file) {
    
        if (!in_array($file,array(".","..")))
        { 
            $file = $dir.$file;
            $filename = basename( $file );
            
          if ( strpos( $filename, 'BI3_' ) === 0 ) {
                
                  // truncate table  
                    $query = "truncate table dbo.Y2_Style";
                    $stmt = $conn->query( $query );
    
        
                   if (($handle = fopen($file, "r")) !== false) {
    
                     $str = str_replace("'", "''", $file);
                     
                     // To remove BOM in the fist cell
                      fseek($handle, 3);
                
                while (($data = fgetcsv($handle, 9000000, ";")) !== false) {        
                    if (empty(array_filter($data))) {
                        
                        continue;
                    }
    
                    
                   $query = "insert into dbo.Y2_Style (stylecode, brandname, department, category, description, season) 
               values('" . $data[0] ."', '" . $data[1] ."','" . $data[2] ."','" . $data[3] ."','" . $data[5] ."', '" . $data[5] ."')"; 
             
                       $stmt = $conn->query( $query );
                       
                       if (!$stmt) { 
                              $file3 = "D:/xampp/htdocs/retail_BI/errors/erreur_BI3.txt";                      
                              file_put_contents($file3, $query . PHP_EOL, FILE_APPEND | LOCK_EX);
                     }
              }
                fclose($handle);
    
                //Moving the file to another folder             
                if(!rename($file, $dest . $filename)) { 
                       echo "error copy";
                  } 
              } 
           } 
        }
    }
      
    echo "good !";
    ?>

【问题讨论】:

  • 您将str_replace("'", "''", $file) 分配给变量$str,而您实际上并未使用该变量。您需要在某处使用$str,因为它包含被替换的内容。

标签: php sql-server csv pdo


【解决方案1】:

试试这个,让我们知道结果:

$files = glob('../App/*');
foreach($files as $file){
    $file_name = explode('/', $file);
    $file_name = end($file_name);
    if(strpos($file_name, 'BI3_') !== 0){
        $file_content = file_get_contents($file);
        $file_content = str_replace("'", "''", $file_content);
        $file_content = str_replace("''''", "''", $file_content);
        
        
        // Your Query
    }
}

【讨论】:

  • @Patrick62,如果可能的话,重写你的代码并使用准备好的语句和参数化查询来防止 SQL 注入问题。
  • @Zhorov 我真的同意你的想法,但这是一个解决问题的社区,而不是代码共享,所以最重要的想法是解决用户问题。我认为 Patrick 和其他可能使用 patrick and me 代码的用户,绝对可以通过真正的方式防止 sql 注入
猜你喜欢
  • 2013-01-22
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 2012-09-21
  • 2016-10-08
  • 2016-02-09
  • 2011-06-24
  • 1970-01-01
相关资源
最近更新 更多