0

特定の mysql 列から価格情報を削除する必要があります。価格は、$ 54.99 または US ドル 54.99 のいずれかの形式で指定できます。

値を一度に 1 つずつ置換できるスクリプトが既にあります。たとえば、$ 54.99 を空白に置き換えることはできますが、何百もの異なる値を置換する必要があります。スクリプトですべての数字、ドル記号、および「米ドル」というテキストを削除するにはどうすればよいでしょうか。

例として、book という名前の列があり、典型的な行には次のようなテキストがあります。

「US ドル」と「54.99」を削除して、残りのテキストが「この本は素晴らしく、費用がかかります」となるようにする必要があります。

私が使用しているスクリプトは次のようになります。

// code here
if($showErrors) {
    error_reporting(E_ALL);
    ini_set('error_reporting', E_ALL);
    ini_set('display_errors',1);
}


$MJCONN = mysql_pconnect($hostname, $username, $password) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_select_db($database,$MJCONN);


$table_sql = 'SHOW TABLES';
$table_q = mysql_query($table_sql,$MJCONN) or die("Cannot Query DB: ".mysql_error());
$tables_r = mysql_fetch_assoc($table_q);
$tables = array();

do{
    $tables[] = $tables_r['Tables_in_'.strtolower($database)];
}while($tables_r = mysql_fetch_assoc($table_q));


$use_sql = array();

$rowHeading = ($queryType=='replace') ? 
        'Replacing \''.$search.'\' with \''.$replace.'\' in \''.$database."'\n\nSTATUS    |    ROWS AFFECTED    |    TABLE/FIELD    (+ERROR)\n"
      : 'Searching for \''.$search.'\' in \''.$database."'\n\nSTATUS    |    ROWS CONTAINING    |    TABLE/FIELD    (+ERROR)\n";

$output = $rowHeading;

$summary = '';

foreach($tables as $table) {

    $field_sql = 'SHOW FIELDS FROM '.$table;
    $field_q = mysql_query($field_sql,$MJCONN);
    $field_r = mysql_fetch_assoc($field_q);


    do {

        $field = $column;
        $type = $field_r['Type'];

        switch(true) {

            case stristr(strtolower($type),'char'): $typeOK = true; break;
            case stristr(strtolower($type),'text'): $typeOK = true; break;
            case stristr(strtolower($type),'blob'): $typeOK = true; break;
            case stristr(strtolower($field_r['Key']),'pri'): $typeOK = false; break; // DO NOT REPLACE PRIMARY-KEYS
            default: $typeOK = false; break;
        }

        if($typeOK) { 

            $handle = $table.'_'.$field;
            if($queryType=='replace') {
                $sql[$handle]['sql'] = 'UPDATE '.$table.' SET '.$field.' = REPLACE('.$field.',\''.$search.'\',\''.$replace.'\')';
            } else {
                $sql[$handle]['sql'] = 'SELECT * FROM '.$table.' WHERE '.$field.' REGEXP(\''.$search.'\')';
            }


            $error = false;
            $query = @mysql_query($sql[$handle]['sql'],$MJCONN) or $error = mysql_error();
            $row_count = @mysql_affected_rows() or $row_count = 0;


            $sql[$handle]['result'] = $query;
            $sql[$handle]['affected'] = $row_count;
            $sql[$handle]['error'] = $error;


            $output .= ($query) ? 'OK        ' : '--        ';
            $output .= ($row_count>0) ? '<strong>'.$row_count.'</strong>            ' : '<span style="color:#CCC">'.$row_count.'</span>            ';
            $fieldName = '`'.$table.'`.`'.$field.'`';
            $output .= $fieldName;
            $erTab = str_repeat(' ', (60-strlen($fieldName)) );
            $output .= ($error) ? $erTab.'(ERROR: '.$error.')' : '';

            $output .= "\n";
        }
    }while($field_r = mysql_fetch_assoc($field_q));
}
4

1 に答える 1

0

mysql には、正規表現に基づいて置換するための組み込み関数がないため、php で行うことができます。テーブルには ID のみが必要です (更新クエリで使用するため)。まだ含まれていない場合は、含めます。

スクリプトで何かを説明したかもしれませんが(よく理解できませんでした)、この回答は質問のテキストに関するものです。うまくいけば、列全体からすべての価格を 1 回削除することが役に立ちます (見つけた場合)。

データベースに接続したら、コードを次のように変更する必要があります

$sql = "SELECT id,book FROM yourtable";    
$result = mysql_query($sql);    
if (!$result) 
{
    echo "Could not successfully run query ($sql) from DB: " . mysql_error();
    exit;
}

if (mysql_num_rows($result) == 0) 
{
    echo "No rows found, nothing to print so am exiting";
    exit;
}

while ($row = mysql_fetch_assoc($result))
{
    $id = $row['id'];
    $book= $row['book'];
    //$pat='/(\$|(US Dollar)) \d+(\.\d+)?/';
    $pat = '/\$|(page)|(US)|(dollar)|(\d+)|~|\.|(sterling)/i';
    if(preg_match($pat, $book))
    {
       $book= preg_replace($pat, '', $book);
       $sql = "UPDATE yourtable set book='".$book."' where id='".$id."'";
       mysql_query($sql);
    }
}

Edit Changed コメントに応じたパターン ($pat の値)。編集2:前回見逃していた「ページ」も追加されました

于 2012-09-09T19:31:48.860 に答える