代码改变世界

第二章 数据的存储与检索(1)2.1—2.4节

2016-07-19 01:43  yojiaku  阅读(384)  评论(0编辑  收藏  举报

学习重点:

  • 保存数据以便后期使用
  • 打开文件
  • 创建并写入文件
  • 关闭文件
  • 读文件
  • 给文件加锁
  • 删除文件
  • 其他有用的文件操作函数
  • 数据库管理系统

存储和检索Bob的订单:

html文件:文件名(orderform.html)

<html>
<head>
    <title>Bob's Auto Parts</title>
</head>
<body>
<h1>Bob's Auto Parts</h1>
<h2>Order Form</h2>

<form action="processorder.php" method=post>
    <table border=0>
        <tr bgcolor=#cccccc>
            <td width=150>Item</td>
            <td width=315>Quantity</td>
        </tr>
        <tr>
            <td>Tires</td>
            <td align=left><input type="text" name="tireqty" size=3 maxlength=3></td>
        </tr>
        <tr>
            <td>Oil</td>
            <td align=left><input type="text" name="oilqty" size=3 maxlength=3></td>
        </tr>
        <tr>
            <td>Spark Plugs</td>
            <td align=left><input type="text" name="sparkqty" size=3 maxlength=3></td>
        </tr>
        <tr>
            <td>Shipping Address</td>
            <td align=center><input type="text" name="address" size=40 maxlength=40></td>
        </tr>
        <tr>
            <td colspan=2 align=center><input type=submit value="Submit Order"></td>
        </tr>
    </table>
</form>

</body>
</html>

explain:

<tr>
       <td>Shopping Address</td>
       <td align=center><input type="text" name="address" size=40 maxlength=40></td>
</tr>

input 中的 size 属性:size属性规定字段的宽度。对于 <input type="text"> 和 <input type="password">, size属性定义的是可见的字符数,而对于其他类型,size属性定义的是以像素为单位的输入字段宽度

一般size属性可以用css代替:<input style="width:100px" />

<tr>
    <td colspan=2 align=center><input type=submit value="Submit Order"></td>
</tr>

td 中的 colspan 属性:设置单元格可横跨的列数。

colspan="0"指示浏览器横跨到列组的最后一列

for example:

<table border="1">
  <tr>
    <th>Month</th>
    <th>Savings</th>
  </tr>
  <tr>
    <td colspan="2">January</td>
  </tr>
  <tr>
    <td colspan="2">February</td>
  </tr>
</table>

the result of this:

html效果如图:

然后我们填写订单,并将订单写入order.txt文本文件中,下面是完整的php代码:

<?php
// create short variable names
$tireqty = $_POST['tireqty'];
$oilqty = $_POST['oilqty'];
$sparkqty = $_POST['sparkqty'];
$address = $_POST['address'];

$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
?>
<html>
<head>
    <title>Bob's Auto Parts - Order Results</title>
</head>
<body>
<h1>Bob's Auto Parts</h1>
<h2>Order Results</h2>
<?php
$date = date('H:i, jS F');

echo '<p>Order processed at ';
echo $date;
echo '</p>';

echo '<p>Your order is as follows: </p>';

$totalqty = 0;
$totalqty = $tireqty + $oilqty + $sparkqty;
echo 'Items ordered: '.$totalqty.'<br />';

if( $totalqty == 0)
{
    echo 'You did not order anything on the previous page!<br />';
}
else
{
    if ( $tireqty>0 )
        echo $tireqty.' tires<br />';
    if ( $oilqty>0 )
        echo $oilqty.' bottles of oil<br />';
    if ( $sparkqty>0 )
        echo $sparkqty.' spark plugs<br />';
}

$totalamount = 0.00;

define('TIREPRICE', 100);
define('OILPRICE', 10);
define('SPARKPRICE', 4);

$totalamount = $tireqty * TIREPRICE
    + $oilqty * OILPRICE
    + $sparkqty * SPARKPRICE;

$totalamount=number_format($totalamount, 2, '.', ' ');

echo '<p>Total of order is '.$totalamount.'</p>';
echo '<p>Address to ship to is '.$address.'</p>';

$outputstring = $date."\t".$tireqty." tires \t".$oilqty." oil\t"
    .$sparkqty." spark plugs\t\$".$totalamount
    ."\t". $address."\n";

// open file for appending
@ $fp = fopen("$DOCUMENT_ROOT/orders.txt", 'ab');

if (!$fp)
{
    echo '<p><strong> Your order could not be processed at this time.  '
        .'Please try again later.</strong></p></body></html>';
    exit;
}
//move flock down here(after if)
flock($fp, LOCK_EX);

fwrite($fp, $outputstring, strlen($outputstring));
flock($fp, LOCK_UN);
fclose($fp);

echo '<p>Order written.</p>';
?>
</body>
</html>

这里将所有的html文件传过来的变量写在了<html>标签的上面,更加方便。

explain:

$date = date('H:i, jS F');

这里使用了date()函数:

Example #1 date() 例子

<?php
// 设定要用的默认时区。自 PHP 5.1 可用
date_default_timezone_set('UTC');


// 输出类似:Monday
echo date("l");

// 输出类似:Monday 15th of August 2005 03:12:46 PM
echo date('l dS \of F Y h:i:s A');

// 输出:July 1, 2000 is on a Saturday
echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));

/* 在格式参数中使用常量 */
// 输出类似:Wed, 25 Sep 2013 15:28:57 -0700
echo date(DATE_RFC2822);

// 输出类似:2000-07-01T00:00:00+00:00
echo date(DATE_ATOM, mktime(0, 0, 0, 7, 1, 2000));
?>

在格式字串中的字符前加上反斜线来转义可以避免它被按照上表解释。如果加上反斜线后的字符本身就是一个特殊序列,那还要转义反斜线。

Example #2 在 date() 中转义字符

<?php
// prints something like: Wednesday the 15th
echo date("l \\t\h\e jS");
?>

可以把 date() 和 mktime() 函数结合使用来得到未来或过去的日期。

Example #3 date() 和 mktime() 例子

<?php
$tomorrow  = mktime(0, 0, 0, date("m")  , date("d")+1, date("Y"));
$lastmonth = mktime(0, 0, 0, date("m")-1, date("d"),   date("Y"));
$nextyear  = mktime(0, 0, 0, date("m"),   date("d"),   date("Y")+1);
?>

一些使用 date() 格式化日期的例子。注意要转义所有其它的字符,因为目前有特殊含义的字符会产生不需要的结果,而其余字符在 PHP 将来的版本中可能会被用上。当转义时,注意用单引号以避免类似 \n 的字符变成了换行符。

<?php
// 假定今天是:March 10th, 2001, 5:16:18 pm
$today = date("F j, Y, g:i a");                 // March 10, 2001, 5:16 pm
$today = date("m.d.y");                         // 03.10.01
$today = date("j, n, Y");                       // 10, 3, 2001
$today = date("Ymd");                           // 20010310
 $today = date('h-i-s, j-m-y, it is w Day z '); // 05-16-17, 10-03-01, 1631 1618 6 Fripm01 $today = date('\i\t \i\s \t\h\e jS \d\a\y.'); // It is the 10th day. $today = date("D M j G:i:s T Y"); // Sat Mar 10 15:16:08 MST 2001 $today = date('H:m:s \m \i\s\ \m\o\n\t\h'); // 17:03:17 m is month $today = date("H:i:s"); // 17:16:17 $today = date("Y-m-d H:i:s"); // 2001-03-10 17:16:18 (MySQL DATETIME 格式) ?>

关于date()函数的具体内容可以参考:http://php.net/manual/zh/function.date.php

$outputstring = $date."\t".$tireqty." tires \t".$oilqty." oil\t"
    .$sparkqty." spark plugs\t\$".$totalamount
    ."\t". $address."\n";

  其中 "\n" 是一个换行符,"\t" 是一个tab符

//\\ open file for appending
@ $fp = fopen("$DOCUMENT_ROOT/orders.txt", 'ab');

  这里是打开文件的操作。

文件处理:

将数据写入一个文件,有3步操作:

  1. 打开这个文件。如果文件不存在,需要先创建它;
  2. 将数据写入这个文件;
  3. 关闭这个文件。

打开文件:要在php中打开一个文件,使用fopen()函数,当打开一个文件的时候,我们需要制定如何使用它,即文件模式。

(fopen()函数的文件模式总结)

最后php效果如下:

值得注意的是,关于文件的路径:

$DOCUMENT_ROOT/orders.txt

  这里使用了php内置变量$_SERVER['DOCUMENT_ROOT'],由于整个表单名称太长了,我们可以指定一个简短的名称:

$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];

  我们可以选用绝对路径,但应该选用相对路径。

我的文件目录如下所示:

这里的orders.txt文本文件是与我的html文件和php文件在同一目录(form2)下的,所以我的路径可写为:$DOCUMENT_ROOT/orders.txt

                                                                                                                                                                                                2016-07-19