如果在数组中替换为相应的列

时间:2012-12-11 20:37:29

标签: php

更新: 我在做什么:

我正在创建一个ETL工具并在php中编写它的脚本: ETL是针对特定域设计的,提供的数据与其结构一致,但数据中存在一些需要删除的肮脏,如H.NO , H#, H.NO. should be = HNO: 我正在使用存储过程的方法。其中我为错误的值创建了一个查找表,并用正确的值替换它们,以便最终存储的数据应该是完美的。

我必须在db表中检测错误的值,并用正确的值替换它们。


我创建了一个存储来自DB的值的数组$find[],然后有一个变量$exist,我想检查它是否存在于$find[wrong]数组中(列) 或不。如果确实如此,那么它的值将替换为相应的cloumn值$find[right]。请告诉我如何才能进行此类替换。谢谢,

注意:我的数据库表只包含两列名为wrong and right

的列

当我转储$find数组时,它给了我以下输出: Array ( [0] => Array ( [0] => FSc [wrong] => FSc [1] => FSC [right] => FSC ) [1] => Array ( [0] => Fsc [wrong] => Fsc [1] => FSC [right] => FSC )

CODE:

$lookup = mysql_query("select * from lookup");
while($getlookup = mysql_fetch_array($lookup))
{
$find[] = $getlookup; 
}
print_r($find);

3 个答案:

答案 0 :(得分:1)

解决MySQL本身问题。撤退时:

 SELECT right, IF(wrong='$exist',right,wrong) as wrong from lookup

当然,使用PDO&准备好的语句而不是mysql_ *,或者在转义变量时要非常小心。

但是,如果需要“错误”的数据:

 UPDATE data_to_fix
 LEFT JOIN lookup l1
 ON data_to_fix.some_field1 LIKE l1.wrong
 LEFT JOIN lookup l2
 ON data_to_fix.some_field2 LIKE l2.wrong
 SET 
   data_to_fix.some_field1 = IFNULL(l1.right, data_to_fix.some_field1),
   data_to_fix.some_field2 = IFNULL(l2.right, data_to_fix.some_field2);

答案 1 :(得分:1)

好的,您只需将查询更改为此

即可
"SELECT right FROM lookup WHERE wrong = '" . $exists . "'"

如果没有匹配,则返回0行。如果匹配,则为一个(或多个行,具体取决于表的设置方式)。

您的wrong字段应该有一个索引来优化查询。如果right的任何值只应有wrong的一个特定值(即wrong在每一行上都是唯一的),那么请wrong使用唯一索引来强制执行它唯一性。


更新了与您修改后的问题相符的答案。我要做的只是使用SQL查询来更新映射表中的错误数据。

所以我假设你的DB结构看起来像这样:

the_table
---------
the_field (the field you are trying to change)
... some other fields

mapping_table
---------
wrong
right

然后,您需要运行以使用已清理的值更新表的查询将是

UPDATE the_table AS t
INNER JOIN mapping_table AS mt ON t.the_field = mt.wrong
SET bt.the_field = mt.right

这会将表更新为新值。显然,如果您不想更改表,则可以复制表,然后针对该表副本运行此查询。

答案 2 :(得分:0)

试试这个。你也想使用PDO或mysqli,因为mysql_ *很快就会消失......

<?php
function check_wrong_right($exist) {
    $lookup = mysql_query("select right from lookup WHERE wrong = '" . mysql_real_escape_string($exist). "'");
    if (mysql_num_rows($lookup) == 1) {
        $row = mysql_fetch_array($lookup);
        return $row['right'];
    }
    return $exist;
}

echo check_wrong_right('FSc');