编码时改进

时间:2013-05-08 13:12:20

标签: php

我需要检查是否存在月度合同以及是否已签署。 我会改进代码,因为它似乎太重了

是时候切换到PDO了,也许我可以重写一些东西来加速脚本

基本上我有一个包含2列的表格 第1列有日期参考,2013 / jan,2013 / fev ...和第2列显示检查文件是否存在并有签名。

这是我的代码。有一种方法可以改善吗?

// QUERY DB
// Get contract
$contract = array();
$query1 = mysql_query("SELECT * FROM contracts
                       WHERE ic_id='28'");
while ($row = mysql_fetch_assoc($query1)) {
    $contract[] = $row['month'];          
}

$signature = array();
$query1 = mysql_query("SELECT * FROM contracts
                       WHERE ic_id='28'");
while ($row = mysql_fetch_assoc($query1)) {
    $signature[] = $row['sign'];          
}

// Get START AND END DATE

$startYear =  '2012';
$startMonth = '12';

$endYear =  '2013';
$endMonth = '12';

$startDate = strtotime("$startYear/$startMonth/01");
$endDate   = strtotime("$endYear/$endMonth/01");

$currentDate = $endDate;

结果表

<tbody>
    <?php
        while ($currentDate >= $startDate) {
        $foo = date('Y-m',$currentDate);   
        $currentDate = strtotime( date('Y/m/01/',$currentDate).' -1 month');
    ?>       
    <tr class="grade">
        <td>    
           <?php   echo $foo; ?>
        </td>

        <td>
        <?php 

        if (in_array($foo, $contract)) { 
        echo "<img src='images/ok.png';
        } else {
        echo "<img src='images/ko.png'/>";   
        }

        if (in_array($foo, $signature)) { 
        echo "<img src='imagens/ok.png'/>";
        } else {
        echo "<img src='imagens/sign.png'/>";   
        }

        ?>
        </td>
    </tr>

    <?php
    $i++;
    }
    ?>                    
</tbody>

2 个答案:

答案 0 :(得分:3)

连接到PDO。

 <?php
 $contract = array();
 $signature = array();
 $db = new PDO('mysql:host=localhost;dbname=<SOMEDB>', '<USERNAME>', 'PASSWORD');
 $st = $db->prepare("SELECT month ,sign FROM contracts   WHERE ic_id=?");
 $st->execute(array('28'));

 foreach($st as $row)
 {
   $contract[] = $row['month']; 
   $signature[] = $row['sign'];
 }
 ?>

为什么在有信息的地方使用变量?例如,在开始和结束日期。如你所知,mysql_ *被删除,所以你应该尽快转移到PDO。将变量命名为$ var1,$ var2是非常糟糕的约定。

检查以下链接:

  1. Zend Conventions
  2. PEAR standards
  3. 正如我上面写的那样

    $startYear =  '2012';
    $startMonth = '12';
    
    $endYear =  '2013';
    $endMonth = '12';
    
    $startDate = strtotime("$startYear/$startMonth/01");
    $endDate   = strtotime("$endYear/$endMonth/01");
    

    这些变量似乎是常量所以使用常量字符串。

    $startDate = strtotime("2012/12/01");
    $endDate   = strtotime("2013/12/01");
    

    此外,您选择查询中的所有列,但只使用2,我已更改您的查询。

    这部分代码

    <?php 
    
        if (in_array($foo, $contract)) { 
        echo "<img src='images/ok.png';
        } else {
        echo "<img src='images/ko.png'/>";   
        }
    
        if (in_array($foo, $signature)) { 
        echo "<img src='imagens/ok.png'/>";
        } else {
        echo "<img src='imagens/sign.png'/>";   
        }
    
        ?>
    

    可以更改为

    <?php 
    
        echo "<img src='images/".(in_array($foo, $contract) ? "ok" : "ko").".png";
        echo "<img src='imagens/".(in_array($foo, $signature) ? "ok" : "ko").".png";
    ?>
    

    更少的代码:)

    echo还有一个快捷语法,您可以使用等号立即跟随开始标记。你可以改变这个:

    <?php   echo $foo; ?>
    

    到这个

    <?=$foo?>
    

    最后一个提示是使用预增量,因为它更快。如果您不需要后期增量操作,请使用pre!

    将$ i ++更改为++ $ i;

答案 1 :(得分:1)

首先想到的是这个重复的SQL查询...

<强>现有

$contract = array();
$query1 = mysql_query("SELECT * FROM contracts
                       WHERE ic_id='28'");
while ($row = mysql_fetch_assoc($query1)) {
    $contract[] = $row['month'];          
}

$signature = array();
$query1 = mysql_query("SELECT * FROM contracts
                       WHERE ic_id='28'");
while ($row = mysql_fetch_assoc($query1)) {
    $signature[] = $row['sign'];          
}

<强>更新

$contract = array();
$signature = array();
$query1 = mysql_query("SELECT month, sign FROM contracts
                       WHERE ic_id='28'");
while ($row = mysql_fetch_assoc($query1)) {
    $contract[] = $row['month'];   
    $signature[] = $row['sign'];       
}

<强>更改

  • 删除了重复的SQL查询。无需查询&amp;环 两次相同的信息。
  • 更新SQL只请求月份和签名列,因为这就是全部 你使用额外的是浪费内存/处理。