1

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

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

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

这是我的代码。有没有办法改进?

// 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>
4

2 回答 2

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 约定
  2. 梨标准

正如我上面写的

$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;

于 2013-05-08T13:25:02.873 回答
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 查询。无需两次查询和循环相同的信息。
  • 将 SQL 更新为仅请求月份和符号列,因为这就是您使用额外的所有内容所浪费的内存/处理。
于 2013-05-08T13:16:11.977 回答