【发布时间】:2017-04-24 13:47:14
【问题描述】:
我正在尝试在以下代码中执行以下操作:
从 wrnt 表中获取“est_no, wo_no, wt_no”。
对于从 wrnt 表中获得的每个 est_no,从 matest 表中获取“itemcode”
如果“itemcode”有前缀SE,那么我递归调用函数,直到没有前缀
获得“itemcode”后,我从 itemast 表中为每个 itemcode 获取相关的“marate”
最后全部插入(wo_no、wt_no、itemcode、marate)
你看到有很多循环和递归,导致运行时间很长。
有什么办法可以避免循环吗?或任何其他方式来优化脚本?
<?php
set_time_limit(200);
Class Matewr{
private $dbhost;
private $dbuser;
private $dbpass;
private $dbname;
private $conn;
private $dsn;
private $pdo;
private $insertquery='replace into compcost.matewr (workord,warrant,itemcode,marate)';
function MateWr(){
$this->dbhost = 'localhost';
$this->dbuser = 'root';
$this->dbpass='';
$this->dbname = 'compcost';
$this->dsn="mysql:host=$this->dbhost;dbname=$this->dbname";
$this->pdo= new PDO ($this->dsn, $this->dbuser, $this->dbpass);
}
function readWrnt(){
$idresult = $this->pdo->query("SELECT est_no, wo_no, wt_no from compcost.wrnt");
while($row= $idresult->fetch())
{
$est_no=$row['est_no'];
$wo_no= $row["wo_no"];
$wt_no= $row["wt_no"];
$this->getItemCodesRecursive($est_no, $wo_no, $wt_no);
$this->pdo->query($this->insertquery);
}
}
function getItemCodesRecursive($est_no, $wo_no, $wt_no){
#$sql = "select itemcode, reccd from compcost.matest where est_no='".$est_no."'";
$sql =$this->pdo->prepare("select itemcode from compcost.matest where est_no=?");
$sql->execute(array($est_no));
$rows = $sql->fetchAll();
foreach($rows as $row){
$itemcode = $row["itemcode"];
if(strcasecmp(substr($itemcode, 0, 2),"se") == 0){
$this->getItemCodesRecursive(substr($itemcode, 2), $wo_no, $wt_no);
}
else{
$sql_marate=$this->pdo->prepare("select MARATE from compcost.itemmast where itemcode=?");
$sql_marate->execute(array($itemcode));
#$result_marate = $this->pdo->query($sql_marate);
#if($row_marate=$result_marate->fetch(PDO::FETCH_LAZY)){
$row_marate=$sql_marate->fetchAll();
foreach($row_marate as $row){
$marate=$row["MARATE"];
$this->insertquery .= " values ('$wo_no','$wt_no','$itemcode','$marate'),";
}
}
}
}
}
$matewr = new MateWr();
$matewr->readWrnt();
?>
感谢和问候
【问题讨论】:
-
您是否有理由要选择 1 by 1 而不是基于 item_code 的所有记录?
-
@SomeoneSpecial 如果商品代码有前缀“SE”,那么它代表另一个 est_no,这就是我进行递归调用的原因。它的混乱
-
带SE前缀你也可以做sql语句来匹配前缀
标签: php mysql loops recursion timeout