我有上表: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。
怎么办?我怎么能轻易做到不会出现内存问题?
如果有人请帮忙吗?
答案 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
如果check1
中存在URL
,请与REGEX核对。如果是,regexp_check1
为1,否则为0.
regexp_check1
为1时,您SUBSTRING
的网址才能获取位于check1
句后的部分。你取第一个字符AFTER(test1
),然后是两个字符AFTER(test11
),三个字符AFTER(test111
)等等,直到ID_PRODUCT的最大长度为止(例如6或7)。您对您隔离的SUBSTR进行REGEX以检查它们是否仅为数字(test1
为数字,test11
仅为数字,test111
不是数字。
然后您知道test11
的内容是您的ID
如果check2
为0,则regexp_check1
执行相同的操作,最后check3
(例如,包含http://www.comadso.dk/products/),以及每个开头你可以拥有。
也许我的想法很糟糕,但是,如果它看起来很愚蠢而且有效,它就不会愚蠢!