0

我需要从特定的 mysql 列中删除价格信息。价格可以是这种格式 $ 54.99 或 US Dollar 54.99

我已经有一个脚本,可以让我一次替换一个值,例如,我可以用空格替换 $ 54.99,但有数百个不同的值需要替换。我将如何让我的脚本删除所有数字以及美元符号和文本“美元”?

举个例子:我有一个名为 book 的列,典型的行中有这样的文字:“这本书很棒,售价 54.99 美元”

我需要删除“美元”和“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 没有基于 regex 的内置替换函数,所以你可以在 php.ini 中更好地进行替换。表中只需要一个 id(用于更新查询)。如果还没有,请包括它。

您可能已经在您的脚本中解释了一些内容(我不能很好地理解),但是这个答案只是关于您的问题的文本。希望从您的整个专栏中删除所有价格一次(在哪里找到)会有所帮助。

连接到数据库后,您需要将代码修改为

$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);
    }
}

编辑更改了响应您的评论的模式($pat 的值)。编辑2:现在也添加了“页面”,我上次错过了

于 2012-09-09T19:31:48.860 回答