检查

时间:2016-06-17 17:31:44

标签: php mysql database

enter image description here

我有上表:tblCompInfo,product_id值不是100%准确,我需要修复它。我总共有543847总共25个不同的公司和12个不同的产品。

现在,这个网址是100%准确的,正如你从我用红色突出显示的图像中看到的那样,这意味着它们是错误的,绿色应该更新为。

TASK: 我需要通过解析URL并获取INTEGER并使用product表进行检查来更新Product_id,如果是产品,则分配值else else 0。

解: 我脑子里有两个解决方案:

1。将整个DATA导出到EXCEL CVS,更改它并将其上传到DATABASE。这意味着我整个星期都只与EXCEL合作。

2。因为我有laravel框架:我可以在PHP中创建一个函数并明智地获取DATA公司,并在条件的foreach循环中更新表。

问题: 所以,为了让我的生活变得轻松,我用一个简单的解决方案制作了PHP函数,它可以工作但是我得到了内存分配问题。

$companyID = ??;

$tblCompInfos = tblCompInfo::where('company_id', '=', $companyID)->get();

foreach($tblCompInfos as $tblCompInfo)
{
    $actual_link = $tblCompInfo->url;
    $pathlink = parse_url($actual_link, PHP_URL_PATH); 
    $product_id_from_url = preg_replace("/[^0-9]/", "" , $pathlink); 
    $FindIfItsInProductTable = Product::find($product_id_from_url); 
    $real_product_id = $FindIfItsInProductTable == null ? 0 : $product_id_from_url;

    DB::table('tblCompInfo')->where('company_id', '=', $companyID)->where('url', '=', $tblCompInfo->url)->update(array(
        'product_id' => $real_product_id,
    ));

    echo $actual_link."-".$real_product_id."=".$tblCompInfo->product_id."<br>";


}

如果它是本地服务器,我会用更多的内存更新我的PHP.ini并完成这项工作。

但是,我有一台LIVE服务器,它必须在实时服务器上完成,我无法控制或权力超过PHP.ini。

怎么办?我怎么能轻易做到不会出现内存问题?

如果有人请帮忙吗?

3 个答案:

答案 0 :(得分:2)

试试这个:

UPDATE [table_name] SET product_id = CONVERT(SUBSTR(url, LOCATE('products/', url)+9, LOCATE('/compare',url)-LOCATE('products/', url)+9),UNSIGNED INTEGER)

但这仅适用于每个url字段后缀为/compare

的情况

答案 1 :(得分:0)

如果您使用MariaDB,可以使用 REGEXP_REPLACE 进行更改,例如

UPDATE your_table
 SET url = REGEXP_REPLACE(url,'[0-9]+',Product_id)
WHERE Product_id > 0;

<强>样品

MariaDB [your_schema]> SELECT REGEXP_REPLACE('http://example.com/products/12/compare','[0-9]+','99');
+--------------------------------------------------------------------+
| REGEXP_REPLACE('http://example.com/products/12/compare','[0-9]+','99') |
+--------------------------------------------------------------------+
| http://example.com/products/99/compare                                 |
+--------------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [your_schema]>

答案 2 :(得分:0)

我有一个非常奇怪的想法,但它可以工作。
看看那个查询:

SELECT 
'http://example.com/products/12/compare' as url,
'http://example.com/products/' as check1,
'http://example.com/termsets/' as check2,
'http://example.com/products/12/compare' REGEXP 'http://example.com/products/' as regexp_check1,    -- check 1
SUBSTRING('http://example.com/products/12/compare', LOCATE('http://example.com/products/','http://example.com/products/12/compare')+LENGTH('http://example.com/products/'),1 ) as test1,
SUBSTRING('http://example.com/products/12/compare', LOCATE('http://example.com/products/','http://example.com/products/12/compare')+LENGTH('http://example.com/products/'),1 ) REGEXP "^[0-9]+$" as test1_only_num,
SUBSTRING('http://example.com/products/12/compare', LOCATE('http://example.com/products/','http://example.com/products/12/compare')+LENGTH('http://example.com/products/'),2 ) as test11,
SUBSTRING('http://example.com/products/12/compare', LOCATE('http://example.com/products/','http://example.com/products/12/compare')+LENGTH('http://example.com/products/'),1 ) REGEXP "^[0-9]+$" as test11_only_num,
SUBSTRING('http://example.com/products/12/compare', LOCATE('http://example.com/products/','http://example.com/products/12/compare')+LENGTH('http://example.com/products/'),3 ) as test111,
SUBSTRING('http://example.com/products/12/compare', LOCATE('http://example.com/products/','http://example.com/products/12/compare')+LENGTH('http://example.com/products/'),1 ) REGEXP "^[0-9]+$" as test111_only_num;

结果:

+----------------------------------------+------------------------------+------------------------------+---------------+-------+----------------+--------+-----------------+---------+------------------+
| url                                    | check1                       | check2                       | regexp_check1 | test1 | test1_only_num | test11 | test11_only_num | test111 | test111_only_num |
+----------------------------------------+------------------------------+------------------------------+---------------+-------+----------------+--------+-----------------+---------+------------------+
| http://example.com/products/12/compare | http://example.com/products/ | http://example.com/termsets/ | 1             | 1     | 1              | 12     | 1               | 12/     | 0                |
+----------------------------------------+------------------------------+------------------------------+---------------+-------+----------------+--------+-----------------+---------+------------------+

Url, check1 and check2只是显示我使用的变量。它是一个主要ID,当然这个查询不可用。

check1

的逻辑
  1. 如果check1中存在URL,请与REGEX核对。如果是,regexp_check1为1,否则为0.

    1. 仅当regexp_check1为1时,您SUBSTRING的网址才能获取位于check1句后的部分。你取第一个字符AFTER(test1),然后是两个字符AFTER(test11),三个字符AFTER(test111)等等,直到ID_PRODUCT的最大长度为止(例如6或7)。
  2. 您对您隔离的SUBSTR进行REGEX以检查它们是否仅为数字(test1为数字,test11仅为数字,test111不是数字。

  3. 然后您知道test11的内容是您的ID

  4. 如果check2为0,则regexp_check1执行相同的操作,最后check3(例如,包含http://www.comadso.dk/products/),以及每个开头你可以拥有。

    也许我的想法很糟糕,但是,如果它看起来很愚蠢而且有效,它就不会愚蠢!