preg_split 使用 php 处理姓氏中的 '

preg_split dealing with ' in a surname using php

我正在将包含每个学生分数的文本文件导入我的 MySQL 数据库。我正在使用 preg_split 来读取每一行并将信息分成单独的数据,这些数据有效,但姓氏包含 ['] 的学生除外,例如 O'Neil。

Error: INSERT INTO student_data (studentID,student_number, termID, course_number, course_name, storecode, grade, percent) VALUES ('13269 3100876170 Jimmy O'Neil 12 2701 MT11 MATHEMATICS 11 Q1 74 74 ','','','','','','','') You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Neil 12 2701 MT11 MATHEMATICS 11 Q1 74 74 ','','','','','','','')' at line 231093

分割文件的代码是:

 ini_set("auto_detect_line_endings", true);

  $file = fopen($target_file,"r");

 while(! feof($file))
  {
 $test= fgets($file);

 $array = preg_split('/\s"+/', $test);
fclose($file);
}

我猜问题出在代码的 ('/\s"+/',$test) 部分。我已经查找了有关正在发生的事情的清晰文档,其中大部分都有意义,但我无法找到您如何包含所有空格但不将 ' 用作描述符。

不要对分隔数据使用正则表达式。使用解析器,在这种情况下,您可以使用:

  1. http://php.net/manual/en/function.fgetcsv.php
  2. http://php.net/manual/en/function.str-getcsv.php

名称中的CSV是默认的,你可以定义你的分隔符。在您的情况下, space 是定界符,双引号用于封装。这会让你成功一半。正确分解此数据后,您应该使用参数化查询,以便您的 mysql 驱动程序根据需要转义数据。

示例使用 str_getcsv:

$string = '"13269" "3100876170" "Jimmy O\'Neil" "12" "2701" "MT11" "MATHEMATICS" "11" "Q1" "74" "74"';
$data = str_getcsv($string, ' ', '"');
print_r($data);

演示:https://3v4l.org/Phpp7

参数化查询:

INSERT INTO student_data (studentID, student_number, termID, course_number, course_name, storecode, grade, percent) VALUES (?, ?, ?, ?, ?, ?, ?, ?) 

然后如果使用 PDO,您可以将 $data 直接传递给 execute 函数。