Board logo

標題: 10-4-2 資料儲存與狀態顯示 [打印本頁]

作者: 小誌    時間: 2011-4-22 03:06     標題: 10-4-2 資料儲存與狀態顯示

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

注意:別忘了先在MySQL Server中建一個名為「AutoAct」的資料庫喔!
作者: 小誌    時間: 2011-4-22 03:07

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

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

作者: 小誌    時間: 2011-4-22 03:10

新研討會資料表的建立與否,取決於資料庫中的有無該研討會資料表的存在,要檢驗資料表是否存在可利用mysql_list_tables()與mysql_tablename()函數。
mysql_list_tables():列出資料庫中全部的資料表。
  1. int mysql_list_tables ( string database_name [, int link_identifier])
複製代碼


mysql_list_tables()函數使用陣列集合的方式來列表取回的資料表名稱。
mysql_tablename()函數:取出結果集中的資料庫或資料表名稱。
  1. int mysql_ tablename ( int result_identifier, int i)
複製代碼
  1. //檢驗資料表是否存在
  2. $testrs=mysql_list_tables("AutoAct");      
  3. if (!($Actname==mysql_tablename($testrs,$Actname)))
  4.    {
  5.     //資料表不存在則建立
  6. //以下略
複製代碼

作者: 小誌    時間: 2011-4-22 03:11

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

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

  20. //判斷非必填欄位'公司'資料是否為空白
  21. if (empty($_REQUEST["Company"]))
  22. {
  23. $Company="";
  24. }
  25. else
  26. {
  27. $Company = $_REQUEST["Company"];
  28. }
  29. //判斷非必填欄位'E-Mail'資料是否為空白
  30. if (empty($_REQUEST["Email"]))
  31. {
  32. $Email="";
  33. }
  34. else
  35. {
  36. $Email = $_REQUEST["Email"];
  37. }

  38. $Actname=$_REQUEST["Actname"];

  39. //連結SQL Server
  40.     $conn = mysql_connect("localhost", "root", "12345a");
  41. //選擇資料庫
  42.     mysql_select_db("AutoAct", $conn);  
  43. //指定提取資料的校對字元表
  44.     mysql_query("set character set big5");
  45. //檢驗資料表是否存在
  46. $testrs=mysql_list_tables("AutoAct");      
  47. if (!($Actname==mysql_tablename($testrs,$Actname)))
  48.    {
  49.     //資料表不存在則建立
  50.     $SQL="Create Table " .
  51.     $Actname .
  52.     " (" .
  53.     "Name varchar(10) Not NULL," .
  54.     "Email varchar(50)," .
  55.     "Company varchar(50)," .
  56.     "Tel varchar(20) Not NULL" .
  57.     ")";
  58.     mysql_query($SQL);
  59.    }
  60.          
  61. //建立查詢字串用以判斷是否重複報名
  62. $SQL="Select name From " . $Actname . " Where name='" . $Name . "'";
  63. $RS=mysql_query($SQL);

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

  79. mysql_close();
  80. ?>

  81. <html>
  82. <head>
  83. <meta http-equiv="Content-Type" content="text/html; charset=big5">
  84. <title>線上報名</title>
  85. </head>
  86. <body>
  87. <p align="center"><img border="0" src="tit.gif" width="231" height="40"></p>
  88. <p align="center"><?=$msg;?></p>
  89. <hr width="80%" color="#FF9900">
  90. <form method="POST" action="listpeople.php">
  91. <p align="center">
  92. <input type="hidden" value="<?=$Actname;?>" name="Actname">
  93. <input type="submit" value="查看已參加人員"
  94. style="background-color: #008000; color: #FFFFFF; border-style: groove">
  95. </p></form>
  96. </body>
  97. </html>
複製代碼

作者: 小誌    時間: 2011-4-22 03:14

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

  17. <HTML>
  18. <head>
  19. <meta http-equiv="Content-Type" content="text/html; charset=big5">
  20. <title><?=$Actname;?>研討會報名人員清單</title>
  21. </head>
  22. <BODY>
  23. <p align="center">
  24. <img border="0" src="../tit.gif">
  25. <p Align="Center">
  26. <font color="#FF9900"><?=$Actname;?>研討會報名人員清單</font></p>
  27. <div align="center">
  28.   <center>
  29. <TABLE Border=1 Cellspacing=1 bordercolor="#800000">
  30.      
  31. <?
  32. //列出欄位抬頭
  33. echo "<tr>";     
  34.       for ($x=0 ;$x<$fieldnum;$x++)
  35.          {
  36.           echo "<td>" . mysql_field_name($datalist,$x) . "</td>";
  37.          }
  38. echo "</tr>";   
  39. //列出欄位資料
  40.       //將資料錄轉換為欄位陣列集合
  41.       while ($fielddatas=mysql_fetch_array($datalist))
  42.           {
  43.              //輸出欄位資料
  44.              echo "<tr>";
  45.              for ($x=0;$x<$fieldnum;$x++)
  46.                 {
  47.                  echo "<td>" . $fielddatas[$x] . "</td>";
  48.                 }
  49.              echo "</tr>";  
  50.           }
  51. ?>

  52. </TABLE>   
  53.   </center>
  54. </div>
  55. <p align="center"><font size="2">
  56. <a href="index.php">返回登錄頁</a></font></p>
  57. </html>
複製代碼

作者: 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

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




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)