麻辣家族討論版版's Archiver

小誌 發表於 2011-4-22 03:06

10-4-2 資料儲存與狀態顯示

[color=DarkRed][size=4][b]10-4-2   資料儲存與狀態顯示[/b][/size][/color]
儲存報名者資料的addpeople.php程式網頁其任務有三項:
1.檢驗研討會的資料表是否存在,如果該研討會資料表不存在,則建立新的研討會資料表。
2.將報名者資料寫入資料庫。
3.顯示報名狀態與參加者清單列表連結。

[color=Red]注意:[/color]別忘了先在MySQL Server中建一個名為「AutoAct」的資料庫喔!

小誌 發表於 2011-4-22 03:07

[color=RoyalBlue][size=3][b]檢驗資料表是否存在[/b][/size][/color]
在報名者資料寫入某個研討會資料表之前,我們必須先判斷一下該資料表是否存在,如果存在就可以將報名者資料直接寫入對應的資料表中,若該資料表不存在,則必須使用SQL中的DML指令建立一個新研討會資料表。

還記得我們研討會資料表的規格吧(表10-1)!建立資料表的DML指令敘述如下:[code]CREATE TABLE [研討會資料表名] (
        Name varchar (10) NOT NULL ,
        Email varchar (50) NULL ,
        Company varchar (50) NULL ,
        Tel varchar (20) NOT NULL
)[/code]而表單中的下拉欄位『actname』所傳遞的資料就是咱們研討會的資料表名稱,所以在PHP程式中我們將DML指令敘述組合如下:[code]    $SQL="Create Table " .
    $研討會資料表名 .
    " (" .
    "Name varchar(10) Not NULL," .
    "Email varchar(50)," .
    "Company varchar(50)," .
    "Tel varchar(20) Not NULL" .
    ")";[/code]

小誌 發表於 2011-4-22 03:10

新研討會資料表的建立與否,取決於資料庫中的有無該研討會資料表的存在,要檢驗資料表是否存在可利用mysql_list_tables()與mysql_tablename()函數。
mysql_list_tables():列出資料庫中全部的資料表。[code]int mysql_list_tables ( string database_name [, int link_identifier])[/code][list]
[*]database_name:指定我們要操作的資料庫名稱。
[*]link_identifier:連線代號,mysql_list_tables()函數只負責取回作用中資料庫內的資料表列表,並沒有連結資料庫的能力,因此,mysql_list_tables()函數必須透過某個已建立並完成資料庫連結的「連線代號」,這個「連線代號」是由mysql_connect()函數所建立的,這個參數可以不指定,在mysql_list_tables()函數執行時會自動找尋最近由mysql_connect()函數所建立的連線。
[/list]

mysql_list_tables()函數使用陣列集合的方式來列表取回的資料表名稱。
mysql_tablename()函數:取出結果集中的資料庫或資料表名稱。[code]int mysql_ tablename ( int result_identifier, int i)[/code][list]
[*]int result_identifier:mysql_list_tables()、mysql_list_dbs()函數所傳回來的結果ID(結果集)。
[*]i:函數所傳回來的結果ID裡的索引。
[/list][code]//檢驗資料表是否存在
$testrs=mysql_list_tables("AutoAct");      
if (!($Actname==mysql_tablename($testrs,$Actname)))
   {
    //資料表不存在則建立
//以下略[/code]

小誌 發表於 2011-4-22 03:11

[color=RoyalBlue][size=3][b]必填欄位是否有資料輸入[/b][/size][/color]
在資料表規劃時,我們把姓名(Name)與聯絡電話(Tel)欄位設定為一定要有資料輸入的欄位(Not NULL),也就是說報名參加研討會者一定要輸入他的姓名與連絡電話,如果沒有資料輸入的話會造成新增資料錄時發生錯誤,所以我們加入下列的判斷敘述:[code]<?
//判斷必填欄位資料是否為空白
//若必填欄位資料空白則返回報名頁
if (empty($_REQUEST["Name"]))
{
header("Location: index.php?msg=您剛剛姓名未填!!");
exit();
}
else if(empty($_REQUEST["Tel"]))
{
header("Location: index.php?msg=您剛剛聯絡電話未填!!");
exit();
}
else
{
//接收來自表單中的必填欄位資料
$Name = $_REQUEST["Name"];
$Tel = $_REQUEST["Tel"];
}[/code]如果必須輸入資料的欄位沒有輸入資料,則將網頁轉向回報名首頁index.php,同時傳遞錯誤訊息。
[attach]5734[/attach]
圖10-24  報名首頁顯示錯誤訊息。

小誌 發表於 2011-4-22 03:12

查看已參加人員的連結設計同樣是採用「表單」方式建立,這個筆者就不再多說了,記得將FORM標籤中的action屬性設定為listpeople.php即可。
addpeople.php[code]<?
//判斷必填欄位資料是否為空白
//若必填欄位資料空白則返回報名頁
if (empty($_REQUEST["Name"]))
{
header("Location: index.php?msg=您剛剛姓名未填!!");
exit();
}
else if(empty($_REQUEST["Tel"]))
{
header("Location: index.php?msg=您剛剛聯絡電話未填!!");
exit();
}
else
{
//接收來自表單中的必填欄位資料
$Name = $_REQUEST["Name"];
$Tel = $_REQUEST["Tel"];
}

//判斷非必填欄位'公司'資料是否為空白
if (empty($_REQUEST["Company"]))
{
$Company="";
}
else
{
$Company = $_REQUEST["Company"];
}
//判斷非必填欄位'E-Mail'資料是否為空白
if (empty($_REQUEST["Email"]))
{
$Email="";
}
else
{
$Email = $_REQUEST["Email"];
}

$Actname=$_REQUEST["Actname"];

//連結SQL Server
    $conn = mysql_connect("localhost", "root", "12345a");
//選擇資料庫
    mysql_select_db("AutoAct", $conn);  
//指定提取資料的校對字元表
    mysql_query("set character set big5");
//檢驗資料表是否存在
$testrs=mysql_list_tables("AutoAct");      
if (!($Actname==mysql_tablename($testrs,$Actname)))
   {
    //資料表不存在則建立
    $SQL="Create Table " .
    $Actname .
    " (" .
    "Name varchar(10) Not NULL," .
    "Email varchar(50)," .
    "Company varchar(50)," .
    "Tel varchar(20) Not NULL" .
    ")";
    mysql_query($SQL);
   }
         
//建立查詢字串用以判斷是否重複報名
$SQL="Select name From " . $Actname . " Where name='" . $Name . "'";
$RS=mysql_query($SQL);

if (!mysql_fetch_array($RS))
{
//如果尚未報名則寫入報名者資料
$sql = "Insert Into " . $Actname . " (name, Email, company, tel) Values ('";
$sql = $sql . $Name . "','";
$sql = $sql . $Email . "','";
$sql = $sql . $Company . "','";
$sql = $sql . $Tel . "')";
mysql_query($sql);
$msg="你已經順利完成<font color=#FF3300>" . $Actname . "</font>研討會報名";
}
else  //重複報名
{
$msg="你已經報名過<font color=#FF3300>" . $Actname . "</font>研討會";
}

mysql_close();
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<title>線上報名</title>
</head>
<body>
<p align="center"><img border="0" src="tit.gif" width="231" height="40"></p>
<p align="center"><?=$msg;?></p>
<hr width="80%" color="#FF9900">
<form method="POST" action="listpeople.php">
<p align="center">
<input type="hidden" value="<?=$Actname;?>" name="Actname">
<input type="submit" value="查看已參加人員"
style="background-color: #008000; color: #FFFFFF; border-style: groove">
</p></form>
</body>
</html>[/code]

小誌 發表於 2011-4-22 03:14

[b][color=RoyalBlue]研討會報名人員清單網頁:listpeople.php[/color][/b][code]<?
//接收查詢研討會資料
    $Actname=$_REQUEST["Actname"];
//連結SQL Server
    $conn = mysql_connect("localhost", "root", "12345a");
//選擇資料庫
    mysql_select_db("AutoAct", $conn);
//指定提取資料的校對字元表
    mysql_query("set character set big5");  
//建立SQL命令字串
    $SQL="Select * From " . $Actname;
//將回傳結果存放於變數中
    $datalist=mysql_query($SQL);
//取得欄位數量
    $fieldnum=mysql_num_fields($datalist);
?>

<HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<title><?=$Actname;?>研討會報名人員清單</title>
</head>
<BODY>
<p align="center">
<img border="0" src="../tit.gif">
<p Align="Center">
<font color="#FF9900"><?=$Actname;?>研討會報名人員清單</font></p>
<div align="center">
  <center>
<TABLE Border=1 Cellspacing=1 bordercolor="#800000">
     
<?
//列出欄位抬頭
echo "<tr>";     
      for ($x=0 ;$x<$fieldnum;$x++)
         {
          echo "<td>" . mysql_field_name($datalist,$x) . "</td>";
         }
echo "</tr>";   
//列出欄位資料
      //將資料錄轉換為欄位陣列集合
      while ($fielddatas=mysql_fetch_array($datalist))
          {
             //輸出欄位資料
             echo "<tr>";
             for ($x=0;$x<$fieldnum;$x++)
                {
                 echo "<td>" . $fielddatas[$x] . "</td>";
                }
             echo "</tr>";  
          }
?>

</TABLE>   
  </center>
</div>
<p align="center"><font size="2">
<a href="index.php">返回登錄頁</a></font></p>
</html>[/code]

shadow0924 發表於 2014-10-26 17:57

你好, 小誌版主, 現在我用了PHP6之後, addpeople.php
的"$testrs=mysql_list_tables("AutoAct"); " 之後我在
官方PHP指示改了mysql_list_tables()如下:
$autoact='autoact';
$SQL="SHOW TABLES FROM $autoact";
$testrs=mysql_query($SQL);

但執行後出了
Warning: mysql_tablename() [function.mysql-tablename]: Unable to jump to row 0 on MySQL result index 4 in C:\AppServ\www\addpeople.php on line 50

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\AppServ\www\addpeople.php on line 66

想請教小誌版主大大我該怎樣辦呢?

shadow0924 發表於 2014-11-4 18:28

已經解決了, 原來是我"寫入報名者資料"漏了一些符號, 謝謝!

頁: [1]

麻辣家族討論版版為 麻辣學園 網站成員  由 昱得資訊工作室 © Since 1993 所提供