私はこのプロジェクトを手渡されましたが、これには多くの問題があります。そのうちの 1 つは、エンド ユーザーが、MS Access から Web サーバー上のディレクトリに直接エクスポートされた CSV ファイルをアップロードしていることです。次のステップでは、いくつかのデータベース テーブルを切り捨て、CSV からすべてのレコードをデータベースに挿入します。
ただし、MS Access がアポストロフィに使用しているアポストロフィ文字には問題があります。シングル クォーテーション ' やダブル クォーテーション " ではありません。アポストロフィです。次のようにします。
"Rock/Classic 80’s-90’s"
今、私はPHPで次のことを試してそれらを取り除きました:
$d = str_replace("’", "", $d);
$d = str_replace(array("'", "\'", "\’", "’"), "", $d);
ただし、これは機能しないようです。実際、このデータに基づいて SQL クエリを実行すると、文字列が早期に終了したと見なされるため、それらを取り除かずに ' を ' に変換し、SQL エラーを引き起こすように常に見えます。
これは、私が使用しているコード ブロックの 1 つです。
$band_insert = "INSERT INTO `schedule` (`Band`, `Date`, `Genre`, `Club`, `Location`, `Venue`, `Time`) VALUES ( '%s', '%s', '%s', '%s', '%s', '%s', '%s' )";
$result = $mysqli->query('TRUNCATE TABLE `schedule`');
if(!$result) die('Truncate error');
if( ($handle=fopen('./export/schedule.csv', 'r')) !== FALSE)
{
while( ($data=fgetcsv($handle, 1000, ',', '"', '\\')) !== FALSE )
{
foreach($data as $d)
{
$d = str_replace("’", "", $d);
# For debugging purposes only
echo "<p>$d</p>";
}
$sql = sprintf($band_insert, $data[0], $data[1], $data[2], $data[3], $data[4], $data[5], $data[6]);
#$sql = $mysqli->real_escape_string($sql);
$result = $mysqli->query($sql);
if( ! $result ) $log[] = lg("Unable to perform query ($mysqli->errno): $mysqli->error");
}
$log[] = lg("Successful upload (".date("Y-m-d").").");
fclose($handle);
}
問題は、なぜこれが機能しないのですか? $d 値をエコーアウトすると、? 正方形で。header('Content-type: text/html; charset=utf-8');
ファイルの先頭にあっても。