4

私はこのプロジェクトを手渡されましたが、これには多くの問題があります。そのうちの 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');ファイルの先頭にあっても。

4

3 に答える 3

4

Access と Excel で同様のハードルがいくつかありましたが、どこかで拾ったこれを使用して、MS の文字をスクラブしました (したがって、元の作成者の功績によるものです)。おそらく、そのまま使用することも、それに応じて調整することもできます。

// First, replace UTF-8 characters.
$text = str_replace(
array("\xe2\x80\x98", "\xe2\x80\x99", "\xe2\x80\x9c", "\xe2\x80\x9d", "\xe2\x80\x93", "\xe2\x80\x94", "\xe2\x80\xa6"),
array("'", "'", '"', '"', '-', '--', '...'),
$text);

// Next, either REPLACE their Windows-1252 equivalents.
$text = str_replace(
array(chr(145), chr(146), chr(147), chr(148), chr(150), chr(151), chr(133)),
array("'", "'", '"', '"', '-', '--', '...'),
$text);

// OR, STRIP their Windows-1252 equivalents.
$text = str_replace(
array(chr(145), chr(146), chr(147), chr(148), chr(150), chr(151), chr(133)),
array('', '', '', '', '', '', ''),
$text);
于 2012-06-15T17:26:01.967 に答える
0

私はあなたのコードを取得し、変数を使用して動作させました。

$string = "Rock/Classic 80’s-90’s";
$replace = "’";
$string = str_replace($replace, "", $string);
echo "<p>$string</p>";
于 2012-06-15T17:31:07.427 に答える
0

私はあなたが書いた何かが間違っているとecho "<p>$d</p>";思います.これはそうあるべきだと思います.

echo "<p>".$d."</p>";
于 2012-06-15T17:23:08.630 に答える