พบกับบทความเกี่ยวกับคอมพิวเตอร์และ programming ได้ที่ http://articles.modoeye.com
PHP development / Mysql Database
Anan
Anan
Tue 26 Sep 2006 20:57:31

สวัสดีครับ

 

คิดว่าคุณคงสบายดีนะครับ และยังรู้สึกขอบคุณอยู่เสมอที่คอยช่วยเหลือในการเขียนโปรแกรม

 

คงต้องรบกวนอีกแล้วครับ ขณะนี้กำลังเขียนในส่วนของการ Insert ข้อมูลลงใน Mysql database ขอสอบถามดังนี้

 

  1. ข้อมูลของ USER มีทั้งหมด 27 ข้อมูล การบันทึกข้อมูลลงใน Mysql database ผมจึงได้แบ่งเก็บออกเป็น 3 tables ซึ่งการแบ่งเก็บข้อมูลออกเป็นหลายตาราง กับการเก็บลงในตารางเดียว อย่างไหนจะได้ผลดีกว่ากันครับ?

  2. 3 tables ที่แบ่งแยกกันเก็บข้อมูลนั้น ผมใช้ข้อมูล email เป็นตัวเชื่อมระหว่าง table คือ ทั้ง table_1, table_2 และ table_3 นั้น จะมี filed email อยู่

  3. การ insert ข้อมูล ลงใน Mysql ทั้ง 3 table นั้น ผมเขียนดังนี้

 

<?

error_reporting(E_ALL ^ E_NOTICE);

session_start();

 

$dbhost="localhost";

$dbname="company";

$dbuser="root";

$dbpass="";

 

if(trim($_POST['code']) !=($_SESSION['ses_code']))

{

   echo"<b>Code does not correct. </b>";

   echo"<a href=add_index.php><b>Please add your company again !</b>";

   exit;

}

 

$link=mysql_connect("localhost","root","");

if (!$link)

{

                print("Error");

}

else

{

                mysql_select_db("company",$link);

                $sql="select email1 from company_1 where email1='$email1'";

                $res=mysql_query($sql, $link);

                $n=mysql_num_rows($res);

                if($n==0)

                {

                $sql="INSERT into company_1(company, cperson, address, country, phone, fax, email1, email2, mail, dtnow)

                values('$company', '$cperson', '$address', '$country', '$phone', '$fax', '$email1', '$email2', '$mail, '$now')";

 

                $sql="INSERT into company_2(email1, productd, dtnow)

                values('$email1', '$productd', '$now')";

 

                $sql="INSERT into company_3(email1, agri, alkohol, nonal, bakery, cannedfood, cereals, candies, sugar, coffee,

                condiments, foodin, fruits, dressings, meat, milk, oil, organic, pasta, ready, seafood, dtnow)

                values('$email1', '$agri', '$alkohol', '$nonal', '$bakery', '$cannedfood', '$cereals', '$candies', '$sugar', '$coffee',

                '$condiments', '$foodin', '$fruits', '$dressings', '$meat', '$milk', '$oil', '$organic', '$pasta', '$ready', '$seafood', '$now')";

 

                $res=mysql_query($sql, $link);

                if($res==1)

                                print("Adding to database is OK.");

                else

                                print("Error adding to table.");

                }

                else

                {

                                print("This email already exists.");

                }

 

}

 

ผมเขียนโปรแกรมดังนี้ แต่พอผมใส่ข้อมูลลงในฟอร์มแล้ว enter ปรากฎว่าขึ้น error “Error adding to table.”

 

พยายามดูแล้วว่าเขียนผิดตรงไหน ก็สุดปัญญา จึงต้องรบกวนด้วยครับ

 

อนันต์

 

 

Administrator
Tue 26 Sep 2006 21:49:45
การจะ insert ข้อมูลลงในฐานข้อมูลนั้น ส่วนตัวแล้วจะดูที่ลักษณะการเขียน interface มากกว่าครับ

ถ้าเราแบ่งการบันทึกออกเป็นขั้นๆ เหมือนกับการสมัครงานหรือสมัครสมาชิก จะสามารถแบ่งเป็นหน้าๆได้ การบันทึกก็อาจจะทำหน้าละ table ก็ได้ครับ

แต่ก็มีบางกรณีที่ไม่สามารถทำเป็นขั้นๆได้ส่วนตัวแล้วก็ทำเป็น table เดียวจะสะดวกกว่าครับ และอีกอย่างคือการทำ index หรือ key อื่นๆเราจะสามารถควบคุมได้ง่ายกว่าครับ

ปัญหาส่วนมากที่ทำเป็น table เดียวนั้นคือเมื่อตอน select ข้อมูลนั้นอย่าใช้ select * ครับเอาเฉพาะข้อมูลที่จำเป็นเท่านั้น เป็นหนึ่งในวิธีการ optimization การเขียน application ติดต่อกับฐานข้อมูลครับ

เท่าที่อ่านดูก็ไม่น่าจะผิดตรงไหนนะครับ เพียงแต่ว่า
1. ตัวแปรต่างๆที่นำมาใช้ในการ insert นั้นมาจากที่ใดหรือครับ
2. ตัวแปร $sql นั้นถูกนำมาใช้ในการเก็บ SQL Query ไว้ 3 ครั้งแต่ว่ามีการสั่ง mysql_query ครั้งเดียว ถ้า script นี้ทำงานได้ก็จะทำให้เกิดการบันทึกลงใน table company_3 เพียง table เดียวครับ ถ้ามี 3 table ต้องใช้ mysql_query() 3 ครั้งครับ
3. การ debug นั้นให้ทำการ echo $sql ในแต่ละช่วงของคำสั่ง แล้วเอาคำสั่ง SQL ที่ถูกแสดงผลออกมานั้นไปรันใน phpMyAdmin ครับจะมีการแจ้งว่าคำสั่งของเรานั้นผิดอย่างไร

*ทุกครั้งที่ทำการ select ข้อมูลเมื่อใช้งานเสร็จแล้วควรใช้ mysql_free_result() เพื่อคืน resource ให้กับระบบครับ แล้วก็ใช้ mysql_close() ทุกครั้งที่ไม่มีการใช้งาน mysql แล้วครับ
**ถ้าตัวแปร $now เป็นค่าเวลาปัจจุบันแล้วสามารถใช้ NOW() ใน mysql ได้ครับจะทำให้ application ทำงานได้เร็วขึ้นครับ
Anan
Anan
Tue 26 Sep 2006 22:47:03

ขอบคุณครับ

 

คำแนะนำในเรื่องของการเก็บข้อมูลลง table นั้น ทำให้ผมสรุปได้แล้วว่าจะเป็น 1 table และคงจะเริ่ม key ข้อมูลใส่ใน database ได้แล้ว เพราะข้อมูลมีจำนวนมาก ผมไม่อยากต้องมาเปลี่ยนอีกทีหลัง

 

ส่วนเรื่องของ $now นั้น ผมเองเห็นในหนังสือ PHP เห็นเขียนมาด้วย และคิดว่าเป็นการบันทึกเวลาปัจจุบัน จึงได้ลองใส่ดู และจะลองดูผลว่าเป็นอย่างไร? อย่างไรก็ดี ในเรื่องนี้คงจะต้องขอคำแนะนำจากคุณดังนี้

 

  1. ผมเขียนโปรแกรมดังนี้

$sql="INSERT into company(email1, dtnow)

                values('$email1', now())";

 

  1. ในฐานข้อมูล Mysql แล้ว ผมต้องมีฟิลด์ dtnow เพิ่มขึ้นดังนี้ใช่ไหมครับ

 

Email1                  dtnow

 

  1. ค่าเวลาของ dtnow นั้นจะโชว์ออกมาเป็นอย่างไรครับ จะโชว์เป็นอย่างนี้หรือเปล่าครับ

25 sep 2006, .

 

  1. แล้วค่าของ dtnow นั้น จะบันทึกอย่างไรครับ?

 

ขอคำแนะนำด้วยครับ

อนันต์

Administrator
Tue 26 Sep 2006 23:16:18
ถ้าต้องการเก็บเวลาลงไปด้วยต้องสร้าง field เพื่อเก็บข้อมูลครับ จะเป็น Date, DateTime, Time, TImestamp ก็แล้วแต่ว่าต้องการเก็บค่าใดครับ ถ้าจะเก็บเวลาที่ทำการบันทึกหรือแก้ไขจะใช้ Datetime, หรือ Timestamp ก็ได้ครับตามแต่ถนัด แต่ส่วนมากแล้วจะให้ใชั timestamp ดีกว่าครับจะใช้เพียง 4 bytes อ้างอิงตาม http://dev.mysql.com/doc/refman/4.1/en/storage-requirements.html และยังสามารถใช้ trigger เพื่อให้บันทึกเวลาอัตโนมัติได้ครับ ส่วนการแสดงผลก็ใช้ DATE_FORMAT() เพื่อใช้ในการจัดรูปแบบการแสดงผล การคำนวณก็ใช้ DATE_ADD(), DATE_SUB() ได้ครับและ timestamp จะมีตัวแปร CURRENT_TIMESTAMP เพื่อใช้ในการหาค่าเวลาปัจจุบันได้ครับ

1-2 ใช้ครับต้องทำการเพิ่ม field
3. สามารถใช้ DATE_FORMAT() เพื่อใช้ในการจัดรูปแบบได้ครับ http://dev.mysql.com/doc/refman/4.1/en/date-and-time-functions.html
4. ค่าของ dtnow นั้นถ้าตั้งเป็นชนิด DateTime ก็จะใช้ NOW() ถ้าเป็น Timestamp ก็จะใช้ CURRENT_TIMESTAMP
Anan
Anan
Wed 27 Sep 2006 17:35:17

ขอบคุณครับที่แนะนำ

 

ผมไปศึกษาหนังสือ PHP ในเรื่องการจัดการเกี่ยวกับวันที่และเวลา และสามารถเขียนโปรแกรมการแสดงเวลาได้ดังนี้

<?

$today=getdate();

$month=$today["month"];

$mday=$today["mday"];

$year=$today["year"];

$hour=$today["hours"];

$minute=$today["minutes"];

$second=$today["seconds"];

echo"<center><fontsize=14><b>";

echo"$month $mday $year ";

echo"".$hour.":".$minute.":".$second;

echo"</b></font></center>";

echo"<br>";

?>

 

แต่ก็มีคำถามว่าผมจะเขียนโปรแกรมนี้เพื่อ insert เวลาเข้าไปเก็บในฐานข้อมูลลูกค้าได้อย่างไร เพื่อที่จะได้ทราบว่าข้อมูลลูกค้าแต่ละรายนั้นผม key เข้าไปเก็บเมื่อไร ซึ่งรวมทั้งการสมัครสมาชิกด้วยว่า สมาชิกเข้ามาสมัครที่เก็บเว็บไซค์เมื่อวันที่เท่าไร?

 

โดยโปรแกรมที่ผมเขียนเพื่อ insert เข้าไปยังฐานข้อมูลใน Mysql เป็นดังนี้

 

<?

error_reporting(E_ALL ^ E_NOTICE);

session_start();

 

$dbhost="localhost";

$dbname="company";

$dbuser="root";

$dbpass="";

 

if(trim($_POST['code']) !=($_SESSION['ses_code']))

{

   echo"<b>Code does not correct. </b>";

   echo"<a href=add_index.php><b>Please add your company again !</b>";

   exit;

}

 

$link=mysql_connect("localhost","root","");

if (!$link)

{

                print("Error");

}

else

{

                mysql_select_db("company",$link);

                $sql="select email1 from company where email1='$email1'";

                $res=mysql_query($sql, $link);

                $n=mysql_num_rows($res);

                if($n==0)

                {

                $sql="INSERT into company(company, cperson, address, country, phone, fax, email1, email2, web,

                productd, agri, alkohol, nonal, bakery, cannedfood, cereals, candies, sugar, coffee, condiments, foodin,

                fruits, dressings, meat, milk, oil, organic, pasta, ready, seafood, mail, dtnow)

               

                values('$company', '$cperson', '$address', '$country', '$phone', '$fax', '$email1', '$email2', '$web',

                '$productd', '$agri', '$alkohol', '$nonal', '$bakery', '$cannedfood', '$cereals', '$candies', '$sugar', '$coffee', '$condiments', '$foodin',

                '$fruits', '$dressings', '$meat', '$milk', '$oil', '$organic', '$pasta', '$ready', '$seafood', '$mail', ‘$dtnow’)";

 

                $res=mysql_query($sql, $link);

                if($res==1)

                                print("Adding to database is OK.");

                else

                                print("Error adding to table.");

                }

                else

                {

                                print("This email already exists.");

                }

 

}

 

?>

 

ตัวแปรที่ใช้ในการเก็บเวลาได้แก่ ตัวแปร dtnow

 

และใน mysql นั้นผมได้เพิ่ม filed dtnow เพื่อใช้ในการเก็บเวลาเป็นดังนี้

 

ฟิลด์ 

ชนิด

แอตทริบิวต์

ว่างเปล่า (null)

ค่าปริยาย

เพิ่มเติม

dtnow 

timestamp(14)

 

ใช่ 

NULL 

 

 

ไม่ทราบว่า field ใน mysql นั้น ถูกต้องหรือเปล่าครับ

 

กรุณาช่วยแนะนำด้วยครับ

 

อนันต์

Administrator
Wed 27 Sep 2006 20:21:42
  $sql="INSERT into company(company, cperson, address, country, phone, fax, email1, email2, web,

                productd, agri, alkohol, nonal, bakery, cannedfood, cereals, candies, sugar, coffee, condiments, foodin,

                fruits, dressings, meat, milk, oil, organic, pasta, ready, seafood, mail, dtnow)

               

                values('$company', '$cperson', '$address', '$country', '$phone', '$fax', '$email1', '$email2', '$web',

                '$productd', '$agri', '$alkohol', '$nonal', '$bakery', '$cannedfood', '$cereals', '$candies', '$sugar', '$coffee', '$condiments', '$foodin',

                '$fruits', '$dressings', '$meat', '$milk', '$oil', '$organic', '$pasta', '$ready', '$seafood', '$mail', CURRENT_TIMESTAMP)";


ตามนี้ได้เลยครับ

Anan
Anan
Thu 28 Sep 2006 08:10:30
ขอบคุณครับ
สาวน้อย
สาวน้อย
Fri 4 Jul 2008 11:00:40

สวัสดีค่ะ

ถ้าต้องการทำ action โดยที่เราทำการเลือกลิ้งแล้วนำข้อมูลไปเก็บลงdatabase ต้องทำอย่างไรบ้างคะ

webmaster
webmaster
Sat 5 Jul 2008 23:38:53
สามารถทำได้ง่ายก็ให้ลิงค์ไปยังไฟล์ที่ต้องการแล้วก็ให้ทำการเก็บข้อมูลให้ หรืออีกวิธีก็ต้องใช้ AJAX ครับ
Reply
Name:
E-mail:
Home | Services | Forum | Classified | Directories | Support | Contact
ATOM feed RSS 0.9 feed RSS 1.0 feed RSS 2.0 feed
Copyright © 2005 - 2007 Modoeye.com, All Rights Reserved.
Disclaimer | Privacy policy | Term of Use | Term of Services
Valid XHTML Valid CSS! PHP: Hypertext Preprocessor MySQL database Apache Powered! FreeBSD Power to serve
Modoeye Sitemap Client login