有一个旧的PHP代码示例(不是真正的代码,只是为了解决问题)。
$q = mysql_query("SELECT MILLIONS ROWS FROM TABLES");
while($row = mysql_fetch_assoc($q)) {
// other different queries (SELECT, INSERT, DELETE, UPDATE) & other complex logic
$q2 = mysql_query("SELECT SOME DATA");
$data = mysql_fetch_assoc($q2);
$q3 = mysql_query("UPDATE SOME ROWS");
$q4 = mysql_query("SELECT SOME OTHER DATA");
// many other code, that works with DataBase and do many other things
// ...
}
这个旧代码工作正常。 但我需要将此代码移动到PHP7和PDO(而不是mysql_)。 在项目中大约有3000个代码这样的地方。
我尝试重写这样的代码:
$pdo = new PDO('connection string');
$q = $pdo->query("SELECT MILLIONS ROWS FROM TABLES");
while($row = $q->fetch()) {
// other different queries (SELECT, INSERT, DELETE, UPDATE) & other complex logic
$q2 = $pdo->query("SELECT SOME DATA");
$data = $q2->fetch();
$q3 = $pdo->query("UPDATE SOME ROWS");
$q4 = $pdo->query("SELECT SOME OTHER DATA");
// many other code, that works with DataBase and do many other things
// ...
}
它不起作用:循环执行一次,尽管表中的行数百万。 这很自然,因为它写在手册中:
如果在下次调用PDO :: query()之前未获取结果集中的所有数据,则您的调用可能会失败。在发出对PDO :: query()的下一次调用之前,调用PDOStatement :: closeCursor()以释放与PDOStatement对象关联的数据库资源。
我可以使用fetchAll重写代码,然后它就可以了。
$pdo = new PDO('connection string');
$q = $pdo->query("SELECT MILLIONS ROWS FROM TABLES");
$rows = $q->fetchAll();
foreach($rows as $row) {
// other different queries (SELECT, INSERT, DELETE, UPDATE) & other complex logic
$q2 = $pdo->query("SELECT SOME DATA");
$data = $q2->fetch();
$q3 = $pdo->query("UPDATE SOME ROWS");
$q4 = $pdo->query("SELECT SOME OTHER DATA");
// many other code, that works with DataBase and do many other things
// ...
}
但是这个选项不适合我,因为fetchAll会占用所有内存并且脚本会失败。
另外,我可以重写这样的代码:
$pdo = new PDO('connection string');
for($i=0; $<=10000; $i++) {
$offset = $i * 1000;
$q = $pdo->query("SELECT ROWS FROM TABLES LIMIT $offset, 1000");
$rows = $q->fetchAll();
foreach($rows as $row) {
// other different queries (SELECT, INSERT, DELETE, UPDATE) & other complex logic
$q2 = $pdo->query("SELECT SOME DATA");
$data = $q2->fetch();
$q3 = $pdo->query("UPDATE SOME ROWS");
$q4 = $pdo->query("SELECT SOME OTHER DATA");
// many other code, that works with DataBase and do many other things
// ...
}
}
但是这种方法不适合我,因为我必须在项目中重写很多代码而我不想这样做。
如何将此代码移至PDO? 是否有其他方法可以在通过第一个查询获取数据时进行PDO查询?
答案 0 :(得分:0)
你不能输入1个查询吗?
SELECT `Table2`.* FROM `Table2`
JOIN `Table1`
ON `Table1`.`id` = `Table2`.`id`
这将更高效,并提供您想要的结果。
答案 1 :(得分:0)
尝试下一步方法:
$q = PDO::query("SELECT Table2.* FROM Table1 JOIN Table2 ON Table2.id=Table1.id");
while($data = $q->fetch()) {
// some code here
}