【问题标题】:Php PDO loop a resource instead of fetchPhp PDO 循环资源而不是获取
【发布时间】:2013-03-12 19:19:31
【问题描述】:

我一直在搜索互联网和这个论坛,但我仍然无法找到一种快速且特别是不会遇到内存使用问题的好方法。这是我的任务:

我在传统mysql中做了什么:

我有 3 个表,比如说:table1、table2 和 table3 假设 table1 有 300.000 行(例如,它们是购买项目) 假设 table2 是产品列表,有 10.000 行 假设表 3 是服务列表,也有 10.000 行

现在,我需要做的是生成一个报告,列出循环中的每次购买,这将检查购买的项目是用于产品还是服务,如果是产品,它将输出名称产品通过获取table2上的对应名称列。如果它是一项服务,也会发生同样的情况......

1) 在手册和论坛中,据说我不能在 PDO 中运行另一个查询而不完成读取我的所有行......这是这种情况,因为我需要运行另一个查询来获取产品/服​​务的名称。 (在 mysql 中这非常简单,因为我可以处理许多结果资源并使用 mysql_result 在它们之间进行迭代)

2) 有人说使用 fetchall 甚至 fetch 会爆炸我的内存使用量,我将无法执行此查询....我已经尝试获取一个包含所有结果 (300K) 的数组,并且形象地说爆炸了我的服务器的内存使用...

所以你们能帮帮我吗?我正在尝试将我的服务器移动到 Windows azure,它们只允许 pdo os sqlsrv .....

好吧,正如有些人问的那样,我的理论代码如下:

// connect to mysql database
$sql = @mysql_connect("{server}","{login}","{password}");
@mysql_select_db("{database}");

// query:
$result = mysql_query("SELECT * FROM table1 ORDER BY purchase_date ASC");

for($i=0;$i<$num;$i++){

   if(mysql_result($result,$i,"purchase_type")==1){

         $result1 = mysql_query("SELECT product_name FROM table2 WHERE id='".mysql_result($result,$i,"purchase_type_id")."'");       
         $name = mysql_result($result1,0,"product_name");

   }else if(mysql_result($result,$i,"purchase_type")==2){

         $result1 = mysql_query("SELECT service_name FROM table3 WHERE id='".mysql_result($result,$i,"purchase_type_id")."'"); 
         $name = mysql_result($result1,0,"service_name");

   }else{

         $name = '{error}';
   }

   echo(($i+1)". ".$name." <br/>");

}

PS:这只是一个示例代码....实际代码比这要长得多,也更复杂....但是如果我能在这里解决这个理论,我就可以弄清楚其余的... :)

PS2:在有人问之前...... table2 和 table3 有不同的列......

谢谢,

【问题讨论】:

  • 发布您的代码和查询,这样我们更容易回答。
  • 发布您的表格结构。如果它们之间存在适当设计的关系,您应该能够使用JOIN 并在一个查询/结果集中获得您需要的所有信息。
  • 表之间的连接值应该在数据库中完成,而不是在脚本中。继续打包和发送查询会很慢。让您的查询执行以下操作很简单: case when type='service' then service.name else product.name end as itemname
  • 假设我不能加入他们......只是想知道,他们可以在不同的物理位置/服务器......甚至在不同的大陆......所以不可能加入...... ..我知道这很慢......但这不是问题的重点......希望你们能理解...... :)
  • 顺便说一句...另一个问题:如何使用条件语句进行 JOIN,例如我的代码中的条件语句?有可能吗?

标签: php mysql azure pdo


【解决方案1】:
SELECT 
  table1.*,
  COALESCE(table2.product_name, table3.service_name, '{error}') as name
FROM table1 
LEFT JOIN table2 
  ON table1.purchase_type = 1
  AND table2.id = table1.purchase_type_id
LEFT JOIN table3 
  ON table1.purchase_type = 2
  AND table3.id = table1.purchase_type_id
ORDER BY table1.purchase_date

请注意,让purchase_type_id 引用 table2 或 table3 您会错过外键的一些优势。

【讨论】:

    【解决方案2】:

    你可以尝试这样的事情(希望它有效,我边走边编):

    <?php
    // connect to SQLserv database with PDO
    $db = new PDO("sqlsrv:server=yourServer; Database=yourDB", "user", "password");
    
    $statement = $db->prepare("SELECT * FROM table1 ORDER BY purchase_date ASC");
    $statement->execute();
    $main_result = $statement->fetchAll(PDO::FETCH_ASSOC);
    $statement->closeCursor();
    unset($statement);
    
    $p_type1 = array();
    $p_type2 = array();
    
    foreach ($main_result as $row => $column) {
        switch ($column["purchase_type"]) {
            case 1:
                $p_type1[] = $column["purchase_type_id"];
                break;
            case 2:
                $p_type2[] = $column["purchase_type_id"];
                break;
        }
    }
    
    $names = array();
    
    $statement = $db->prepare("SELECT product_name FROM table2 WHERE id = :id");
    foreach ($p_type1 as $value) {
        $statement->execute(":id" => $value);
        $result = $statement->fetchAll(PDO::FETCH_ASSOC);
        $statement->closeCursor();
        $names[] = $result[0]["product_name"];
    }
    unset($statement);
    $statement = $db->prepare("SELECT service_name FROM table3 WHERE id = :id");
    foreach ($p_type2 as $value) {
        $statement->execute(":id" => $value);
        $result = $statement->fetchAll(PDO::FETCH_ASSOC);
        $statement->closeCursor();
        $names[] = $result[0]["service_name"];
    }
    
    foreach ($names as $key => $value) {
        echo "$key. $value<br />\n";
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      相关资源
      最近更新 更多