在循环中多次执行MySQL查询和创建实例

时间:2012-01-29 07:42:56

标签: php mysql

我有一个Web应用程序,需要SELECTINSERT查询到MySQL数据库,并使用new运算符在循环内实例化PHP类几千次。可能有我现有逻辑的替代方案,但我的观点是,如果我继续这种逻辑会有什么危害吗?我不打扰目前与算法相关的时间复杂度,但是担心在事务或内存使用期间是否出现任何问题。我正在提供一段代码供参考

$stm_const = "select ce.TIMETAKEN, qm.QMATTER as STRING1, ce.SMATTER as STRING2 from  w_clkexam ce, clkmst cm, qsmst qm where ce.QID=qm.QID and cm.ROLLNO=ce.ROLLNO";

for ($c=0; $c < count($rollnos); $c++) {
$stm3 =$stm_const." "."and ce.ROLLNO='$rollnos[$c]'";
$qry3 = mysql_query($stm3) or die("ERROR 3:".mysql_error());
while($row1 = mysql_fetch_array($qry3)) {
    echo $string1=$row1['STRING1'];
    echo $string2=$row1['STRING2'];

    $phpCompareStrings=new PhpCompareStrings($string2, $string1);
    $percent=$phpCompareStrings->getSimilarityPercentage();
    $percent2=$phpCompareStrings->getDifferencePercentage();
    echo '$string1 and $string2 are '.$percent.'% similar and '.$percent2.'%  differnt<br/>';
    }// end while
}// end for

请帮助,我正在等待你的意见,以便我可以进一步行动。提前致谢。

1 个答案:

答案 0 :(得分:0)

我没有看到任何问题。您只需从数据库中获取所有行,并为每行比较字符串。在每次将对象分配给同一个变量时,旧对象在创建新对象之前被销毁。所以你总是在内存中只有一个对象实例。问题是你想对结果做些什么?只能在示例中打印它们,或者存储结果以便进一步处理?

无论如何,我认为在不修改类的情况下优化代码是不可能的。如果您使用this class,则可以尝试修改它以便它可以接受多个字符串。使用此方法,您只能创建该类的一个实例,并且可以避免为每一行销毁/创建对象。它将为您节省一些CPU时间,但不会节省内存(因为在任何时候,只有1个类的实例处于活动状态)。

以下未经测试的修改: 在类中修改此函数:

  function __construct($str1,$str2){
        $str1=trim($str1);
        $str2=trim($str2);
        if($str1==""){ trigger_error("First parameter can not be left blank", E_USER_ERROR); }
        elseif($str2==""){ trigger_error("Second parameter can not be left blank", E_USER_ERROR); }
        else{
            $this->str1=$str1;
            $this->str2=$str2;
            $this->arr1=explode(" ",$str1);
            $this->arr2=explode(" ",$str2);
        }
    }

这两个功能:

  function init($str1,$str2){
        $str1=trim($str1);
        $str2=trim($str2);
        if($str1==""){ trigger_error("First parameter can not be left blank", E_USER_ERROR); }
        elseif($str2==""){ trigger_error("Second parameter can not be left blank", E_USER_ERROR); }
        else{
            $this->str1=$str1;
            $this->str2=$str2;
            $this->arr1=explode(" ",$str1);
            $this->arr2=explode(" ",$str2);
        }
    }

  function __construct($str1,$str2){ $this->init($str1,$str2); }

然后在循环外创建对象,只在循环内调用$phpCompareStrings->init($string2,$string1)