php - PHP处理MySQL逐行查询
问题描述
我结合了一个 PHP 脚本来计算 MySQL 文本字段中的单词并相应地更新另一个字段。
它适用于相对较小的表 - 但是当我尝试使用非常大的表(10M 记录)时 - 当然我有“PHP致命错误:允许的内存大小为 134217728 字节已用尽”
有人可以提示如何修改下面的脚本以“逐行”处理数据吗?
<?php
$con1 = mysqli_connect('localhost','USERNAME','PASSWORD','DATABASE');
if (!$con1) {
die('Could not connect: ' . mysqli_error($con1));
}
$sql = "SELECT id FROM TableName";
$result = mysqli_query($con1, $sql);
while ($row = mysqli_fetch_assoc($result)) {
$to = $row["id"];
$sql1 = "SELECT textfield FROM TableName WHERE id = '$to' ";
$result1 = mysqli_query($con1,$sql1);
$row1 = mysqli_fetch_assoc($result1);
$words=(str_word_count($row1['textfield'],0));
$sql2="UPDATE TableName SET wordcount = '$words' WHERE id ='$to'";
$result2 = mysqli_query($con1,$sql2);
}
mysqli_close($con1);
?>
解决方案
MySQL 查询有子句limit o, n
,所以你可以运行
SELECT id FROM TableName limit 0, 10
例如从一开始就只获取 10 个元素。现在,第一个数字是偏移量(您开始工作的索引),第二个是您希望获得的元素数量。现在,这些是你需要知道的想法才能成功地做到这一点:
- 你需要写一个循环
- 在循环中,您将始终获得 n 个元素(n 可以是您想要的 1,或者更多)
- 在每一步中,您将 o 增加 n,因此新的偏移量将从结果先前结束的位置开始
- 您可以确保订单,
order by id
例如 - 您可以将我们在这里谈论的循环包裹在您的大部分代码中
推荐阅读
- react-native - 使用 react-native-dialog,如何更改对话框的高度和宽度
- slim - 安装新版本 4.12 后,我在 Slim 4 上不断收到此错误
- .net - 保存生成的文件链接
- java - 我无法打开 OMNeT++ IDE
- angular - 如何在 Typescript 中动态禁用或启用 ng-multiselect-dropdown
- python - sqlalchemy 等价于 sql 语法
- php - 在路由组中分配中间件和在控制器的构造函数中启动它有什么区别吗?
- php - 使用imagick从PDF创建图像时出现以下错误,任何人都可以帮助修复它
- javascript - webpack 4 给出背景: url([object Module]) as bg image
- jasmine - Uncaught ReferenceError: Zone is not defined (Jasmine)