 |
อยากรู้ว่าแต่ละท่านจัดการ การเขียน sql กับ php ยังไง ไม่ให้ตาลายครับ |
|
 |
|
|
 |
 |
|
ผมเขียน sql หลายๆ บรรทัดแล้วตาลายครับ ทำให้สลับตัวแปรบ้าง
เลยอยากทราบว่า แต่ละท่านจัดบรรทัดกันยังไงครับ
ผมเขียนแบบนี้ ซึ่งตาลายมากครับ 
Code (PHP)
$sql = "INSERT INTO cal_info \n";
$sql .= "( cal_id, ans_patient, ans_patient_csi, ans_patient_sum, ans_nurse, ans_nurse_csi, ans_nurse_sum, \n";
$sql .= "ans_pick, ans_pick_csi, ans_pick_sum, gen_m, gen_m_csi, gen_m_sum, gen_w, \n";
$sql .= "gen_w_csi, gen_w_sum, age_rang1, age_rang1_csi, age_rang1_sum, age_rang2, \n";
$sql .= "age_rang2_csi, age_rang2_sum, age_rang3, age_rang3_csi, age_rang3_sum, age_rang4, age_rang4_csi, age_rang4_sum, \n";
$sql .= "age_rang5, age_rang5_csi, age_rang5_sum, edu_primary, edu_primary_csi, edu_primary_sum, edu_high, \n";
$sql .= "edu_high_csi, edu_high_sum, edu_bachelor, edu_bachelor_csi, edu_bachelor_sum, cash_money, cash_money_csi, cash_money_sum, \n";
$sql .= "cash_tack, cash_tack_csi, cash_tack_sum, first_first, first_first_csi, first_first_sum, first_more, \n";
$sql .= "first_more_csi, first_more_sum, like1, like2, like3, like4,\n";
$sql .= "like5, like6, like7, like_sumary, like_no, \n";
$sql .= "com1_yes, com1_no, com2_yes, com2_no, \n";
$sql .= "com3_yes, com3_no, paper_sum, \n";
$sql .= "ans_patient_5, ans_nurse_5, ans_pick_5, gen_m_5, gen_w_5, \n";
$sql .= "age_rang1_5, age_rang2_5, age_rang3_5, age_rang4_5, age_rang5_5, \n";
$sql .= "edu_primary_5, edu_high_5, edu_bachelor_5, cash_money_5, cash_tack_5, \n";
$sql .= "first_first_5, first_more_5 \n";
$sql .= " ) \n";
$sql .= "VALUES \n ";
$sql .= "('$cal_id', '$ans[0]', '$ans_patient_csi', '$ans_patient_sum', '$ans[1]', '$ans_nurse_csi', '$ans_nurse_sum', \n ";
$sql .= " '$ans[2]', '$ans_pick_csi', '$ans_pick_sum', '$gen[0]', '$gen_m_csi', '$gen_m_sum', '$gen[1]', \n ";
$sql .= " '$gen_w_csi', '$gen_w_sum', '$age[0]', '$age_rang1_csi', '$age1_sum', '$age[1]', \n ";
$sql .= " '$age_rang2_csi', '$age2_sum', '$age[2]', '$age_rang3_csi', '$age3_sum', '$age[3]', '$age_rang4_csi', '$age4_sum', \n ";
$sql .= " '$age[4]', '$age_rang5_csi', '$age5_sum', '$edu[0]', '$edu_primary_csi', '$edu_primary_sum', '$edu[1]', \n ";
$sql .= " '$edu_high_csi', '$edu_high_sum', '$edu[2]', '$edu_bachelor_csi', '$edu_bachelor_sum', '$cash[0]', '$cash_money_csi', '$cash_money_sum', \n ";
$sql .= " '$cash[1]', '$cash_tack_csi', '$cash_tack_sum', '$first[0]', '$first_first_csi', '$first_first_sum', '$first[1]', \n ";
$sql .= " '$first_more_csi', '$first_more_sum', '$likeans[1]', '$likeans[2]', '$likeans[3]', '$likeans[4]', \n ";
$sql .= " '$likeans[5]', '$likeans[6]', '$likeans[7]', '$sumlike', '$like_no', \n ";
$sql .= " '$com1[0]', '$com1[1]', '$com2[0]', '$com2[1]', \n ";
$sql .= " '$com3[0]', '$com3[1]', '$sumpaper', \n";
$sql .= " '$ans_patient[5]', '$ans_nurse[5]', '$ans_pick[5]', '$gen_m[5]', '$gen_w[5]', \n ";
$sql .= " '$age1[5]', '$age2[5]', '$age3[5]', '$age4[5]', '$age5[5]', \n ";
$sql .= " '$edu_primary[5]', '$edu_high[5]', '$edu_bachelor[5]', '$cash_money[5]', '$cash_tack[5]', \n ";
$sql .= " '$first_first[5]', '$first_more[5]' \n ";
$sql .= " ); \n ";
mysql_query($sql)or die("<pre>$sql</pre>".mysql_error());
Tag : PHP, MySQL, HTML/CSS
|
|
 |
 |
 |
 |
Date :
2014-09-10 11:19:39 |
By :
clubp_mark |
View :
1193 |
Reply :
18 |
|
 |
 |
 |
 |
|
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ค่อยๆ เขียนทีละส่วน จากในไปหานอก
เทสทีละอันไปเรื่อยๆ จะได้รู้ว่าผิดตรงไหน
แต่ถ้าจะเปลี่ยนอะไรเพิ่มเติม ก็เขียนใหม่ ของที่เขียนเสร็จแล้ว รันได้ถูกต้องแล้ว จะไม่แตะต้องมันเด็ดขาด
Code (C#)
StringBuilder sb = new StringBuilder();
sb.AppendLine("SELECT r1.SectionCode, se.SectionName, r1.ProductCode, p.ProductName, p.GroupID, pg.GroupName, r1.CCtr, c.CCtrShortName AS Sector,");
sb.AppendLine("CASE WHEN dbo.Zone.ID = 1 THEN dbo.Zone.ZoneName + ' - ' + c.CCtrShortName ELSE dbo.Zone.ZoneName END AS Zone,");
sb.AppendLine("r1.Balance, ABS(r1.Cancel) * -1 AS Cancel, r1.AccruedRevenue AS Accrued,");
sb.AppendLine("r1.Balance + (ABS(r1.Cancel) * -1) + r1.AccruedRevenue AS Total");
sb.AppendLine("FROM (SELECT");
sb.AppendLine("CASE WHEN invoice.SectionCode IS NULL THEN AccruedRevenue.SectionCode ELSE invoice.SectionCode END AS SectionCode,");
sb.AppendLine("CASE WHEN invoice.ProductCode IS NULL THEN AccruedRevenue.ProductCode ELSE invoice.ProductCode END AS ProductCode,");
sb.AppendLine("CASE WHEN invoice.CCtr IS NULL THEN AccruedRevenue.CCtr ELSE invoice.CCtr END AS CCtr,");
sb.AppendLine("CASE WHEN invoice.Balance IS NULL THEN 0 ELSE invoice.Balance END AS Balance,");
sb.AppendLine("CASE WHEN invoice.Cancel IS NULL THEN 0 ELSE invoice.Cancel END AS Cancel,");
sb.AppendLine("CASE WHEN AccruedRevenue.AccruedRevenue IS NULL THEN 0 ELSE CONVERT(money, AccruedRevenue) END AS AccruedRevenue");
sb.AppendLine("FROM (SELECT");
sb.AppendLine("CASE WHEN Balance_0.SectionCode IS NULL THEN Cancel_0.SectionCode ELSE Balance_0.SectionCode END AS SectionCode,");
sb.AppendLine("CASE WHEN Balance_0.ProductCode IS NULL THEN Cancel_0.ProductCode ELSE Balance_0.ProductCode END AS ProductCode,");
sb.AppendLine("CASE WHEN Balance_0.CCtr IS NULL THEN Cancel_0.CCtr ELSE Balance_0.CCtr END AS CCtr,");
sb.AppendLine("CASE WHEN Balance_0.Balance IS NULL THEN 0 ELSE Balance_0.Balance END AS Balance,");
sb.AppendLine("CASE WHEN Cancel_0.balance IS NULL THEN 0 ELSE Cancel_0.balance END AS Cancel");
sb.AppendLine("FROM (SELECT");
sb.AppendLine("SectionCode, ProductCode, CCtr, SUM(Balance) AS Balance");
sb.AppendLine("FROM (SELECT");
sb.AppendLine("Balance_1.SectionCode, Balance_1.ProductCode,");
sb.AppendLine("CASE WHEN Home_1.CCtr IS NULL THEN Balance_1.RevenueCode ELSE Home_1.CCtr END AS CCtr,");
sb.AppendLine("Balance_1.Balance");
sb.AppendLine("FROM (SELECT");
sb.AppendLine("Summary_1.SectionCode, Detail_1.ProductCode, Detail_1.RevenueCode, SUM(Detail_1.Balance) AS Balance");
sb.AppendLine("FROM dbo.Detail AS Detail_1");
sb.AppendLine("INNER JOIN dbo.Summary AS Summary_1 ON Detail_1.InvoiceNo = Summary_1.InvoiceNo");
sb.AppendLine("WHERE (Summary_1.InvoiceDate BETWEEN @StartDate AND @EndDate)");
sb.AppendLine("AND (Summary_1.SectionCode <> '00000') AND (NOT (Summary_1.InvoiceNo LIKE 'MV%'))");
sb.AppendLine("GROUP BY Summary_1.SectionCode, Detail_1.ProductCode, Detail_1.RevenueCode) AS Balance_1");
sb.AppendLine("LEFT OUTER JOIN dbo.HomeLocation AS Home_1 ON Balance_1.RevenueCode = Home_1.LocationCode) AS Balance_2");
sb.AppendLine("GROUP BY SectionCode, ProductCode, CCtr) AS Balance_0");
sb.AppendLine("FULL OUTER JOIN (");
sb.AppendLine("SELECT SectionCode, ProductCode, CCtr, SUM(Balance) AS Balance");
sb.AppendLine("FROM (SELECT");
sb.AppendLine("Cancel_3.SectionCode, Cancel_3.ProductCode,");
sb.AppendLine("CASE WHEN hh.cctr IS NULL THEN Cancel_3.RevenueCode ELSE hh.cctr END AS CCtr, ");
sb.AppendLine("Cancel_3.Balance");
sb.AppendLine("FROM (SELECT");
sb.AppendLine("Cancel_2.SectionCode, Detail_2.ProductCode, Detail_2.RevenueCode, SUM(Detail_2.Balance) AS Balance");
sb.AppendLine("FROM dbo.Detail AS Detail_2");
sb.AppendLine("INNER JOIN");
sb.AppendLine("(SELECT Cancel_1.InvoiceNo, Summary_2.SectionCode");
sb.AppendLine("FROM dbo.Disconnect AS Cancel_1");
sb.AppendLine("INNER JOIN dbo.Summary AS Summary_2 ON Cancel_1.InvoiceNo = Summary_2.InvoiceNo");
sb.AppendLine("WHERE (Summary_2.InvoiceDate > @LastYear)");
sb.AppendLine("AND (Cancel_1.EndDate BETWEEN @StartDate AND @EndDate)");
sb.AppendLine("AND (Summary_2.SectionCode <> '00000') AND (NOT (Summary_2.InvoiceNo LIKE 'MV%'))) AS Cancel_2 ON Detail_2.InvoiceNo = Cancel_2.InvoiceNo");
sb.AppendLine("GROUP BY Cancel_2.SectionCode, Detail_2.ProductCode, Detail_2.RevenueCode) AS Cancel_3");
sb.AppendLine("LEFT OUTER JOIN dbo.HomeLocation AS hh ON Cancel_3.RevenueCode = hh.LocationCode) AS Cancel");
sb.AppendLine("GROUP BY SectionCode, ProductCode, CCtr) AS Cancel_0 ON Balance_0.SectionCode = Cancel_0.SectionCode");
sb.AppendLine("AND Balance_0.ProductCode = Cancel_0.ProductCode AND Balance_0.CCtr = Cancel_0.CCtr) AS Invoice");
sb.AppendLine("FULL OUTER JOIN (");
sb.AppendLine("SELECT SectionCode, ProductCode, CCTR, Amount1, Amount2, Amount1 + Amount2 AS AccruedRevenue");
sb.AppendLine("FROM (SELECT");
sb.AppendLine("CASE WHEN m1.docdate IS NULL THEN m2.docdate ELSE m1.docdate END AS DocDate,");
sb.AppendLine("CASE WHEN m1.SectionCode IS NULL THEN m2.SectionCode ELSE m1.SectionCode END AS SectionCode,");
sb.AppendLine("CASE WHEN m1.ProductCode IS NULL THEN m2.ProductCode ELSE m1.ProductCode END AS ProductCode,");
sb.AppendLine("CASE WHEN m1.CCTR IS NULL THEN m2.CCTR ELSE m1.CCTR END AS CCTR,");
sb.AppendLine("CASE WHEN m1.Amount IS NULL THEN 0 ELSE m1.Amount END AS Amount1,");
sb.AppendLine("CASE WHEN m2.Amount IS NULL THEN 0 ELSE m2.Amount END AS Amount2");
sb.AppendLine("FROM (SELECT");
sb.AppendLine("SectionCode, CCTR, ProductCode, ABS(SUM(Amount)) * - 1 AS Amount,");
sb.AppendLine("DATEADD(mm, 1, CONVERT(smalldatetime, '1/' + CONVERT(nvarchar(2), MONTH(DocDate)) + '/' + CONVERT(nvarchar(4), YEAR(DocDate), 103))) AS DocDate");
sb.AppendLine("FROM dbo.AccruedRevenue AS AccruedRevenue_4");
sb.AppendLine("WHERE (CONVERT(smalldatetime, '1/' + CONVERT(nvarchar(2), MONTH(DocDate)) + '/' + CONVERT(nvarchar(4), YEAR(DocDate), 103)) <> (");
sb.AppendLine("SELECT MAX(CONVERT(smalldatetime, '1/' + CONVERT(nvarchar(2), MONTH(DocDate)) + '/' + CONVERT(nvarchar(4), YEAR(DocDate), 103))) AS DocDate");
sb.AppendLine("FROM dbo.AccruedRevenue AS AccruedRevenue_1))");
sb.AppendLine("GROUP BY SectionCode, CCTR, ProductCode, YEAR(DocDate), MONTH(DocDate)) AS m1");
sb.AppendLine("FULL OUTER JOIN (");
sb.AppendLine("SELECT SectionCode, CCTR, ProductCode, SUM(Amount) AS Amount,");
sb.AppendLine("CONVERT(smalldatetime, '1/' + CONVERT(nvarchar(2), MONTH(DocDate)) + '/' + CONVERT(nvarchar(4), YEAR(DocDate), 103)) AS DocDate");
sb.AppendLine("FROM dbo.AccruedRevenue AS AccruedRevenue_3");
sb.AppendLine("WHERE (CONVERT(smalldatetime, '1/' + CONVERT(nvarchar(2), MONTH(DocDate)) + '/' + CONVERT(nvarchar(4), YEAR(DocDate), 103)) <> (");
sb.AppendLine("SELECT MIN(CONVERT(smalldatetime, '1/' + CONVERT(nvarchar(2), MONTH(DocDate)) + '/' + CONVERT(nvarchar(4), YEAR(DocDate), 103))) AS DocDate");
sb.AppendLine("FROM dbo.AccruedRevenue AS AccruedRevenue_2))");
sb.AppendLine("GROUP BY SectionCode, CCTR, ProductCode, YEAR(DocDate), MONTH(DocDate)) AS m2 ON m1.SectionCode = m2.SectionCode");
sb.AppendLine("AND m1.CCTR = m2.CCTR AND m1.ProductCode = m2.ProductCode");
sb.AppendLine("AND m1.DocDate = m2.DocDate) AS Accrued_1");
sb.AppendLine("WHERE (DocDate = @StartDate)) AS AccruedRevenue ON Invoice.SectionCode = AccruedRevenue.SectionCode");
sb.AppendLine("AND Invoice.ProductCode = AccruedRevenue.ProductCode AND Invoice.CCtr = AccruedRevenue.CCTR) AS r1");
sb.AppendLine("INNER JOIN dbo.Section AS se ON r1.SectionCode = se.SectionCode");
sb.AppendLine("LEFT OUTER JOIN dbo.Product AS p ON r1.ProductCode = p.ProductCode");
sb.AppendLine("LEFT OUTER JOIN dbo.CostCenter AS c ON r1.CCtr = c.CCtr");
sb.AppendLine("LEFT OUTER JOIN dbo.Zone ON c.ZoneID = dbo.Zone.ID");
sb.AppendLine("LEFT OUTER JOIN dbo.ProductGroup AS pg ON p.GroupID = pg.ID");
sb.AppendLine("ORDER BY r1.SectionCode, p.GroupID, r1.ProductCode, r1.CCtr ASC");
|
 |
 |
 |
 |
Date :
2014-09-10 11:30:24 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แนะนำให้เขียนประมาณนี้ครับ ดูง่ายดี แยกเป็นส่วนๆ
Code (PHP)
$sql = " INSERT INTO tbl_content_1234(
content_name
, content_detail
, content_profile
, content_start_date
, content_end_date
, content_status
, content_view
, content_type
, content_date
, content_time
, content_admin
, content_ip)
VALUES(
'$title'
, '$detail'
, '$imgProfile'
, '$start_date'
, '$end_date'
, '1'
, '0'
, '0'
, '$today'
, '$time'
, '$_SESSION[mem_uname]'
, '$_SERVER[REMOTE_ADDR]'
)
"
|
 |
 |
 |
 |
Date :
2014-09-10 11:50:16 |
By :
arm8957 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
หมายถึงแบบนี้ครับ
<?php
$cal_id = '2';
$ans[0] = '3';
$ans_patient_csi = '4';
$ans_patient_sum = '5';
$data = array(
'cal_id' => $cal_id,
'ans_patient' => $ans[0],
'ans_patient_csi' => $ans_patient_csi,
'ans_patient_sum' => $ans_patient_sum
);
$field = implode(', ', array_keys($data));
$value = "'". implode("', '", array_values($data)) . "'";
$sql = "INSERT INTO cal_info ($field) VALUES ($value)";
echo $sql;
?>
|
 |
 |
 |
 |
Date :
2014-09-10 21:34:14 |
By :
{Cyberman} |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อาร์เรย์ $data จะใช้เอาไปสร้าง INSERT หรือ UPDATE ก็ได้
และขั้นตอนการพิมพ์ก้ไม่มีพลาด เพราะซ้ายคือชื่อฟิลด์ ขวาคือค่าที่ต้องการบันทึก ไม่มีหลงฟิลด์ครับ 
เมื่อเช้าผมหาลิงค์ไม่เจอ อันนี้ลิงค์ใหม่นะครับมีตัว DEMO ให้ลองเล่นด้วย
http://www.sunzan-design.com/2013/05/php-codeing-generate-sql-insert-command.html
ปล. มีซอร์สโค๊ดในหน้า DEMO และตัวอย่างผลลัพธ์ 3 แบบที่นำไปใช้งานต่อไป
แบบที่ 3 คือตัวอย่างที่ผมแนะนำไปในคอมเมนต์ก่อนหน้านี้ครับ
|
ประวัติการแก้ไข 2014-09-10 21:37:54 2014-09-10 21:39:52
 |
 |
 |
 |
Date :
2014-09-10 21:35:44 |
By :
{Cyberman} |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ถ้าชำนาญแล้วก็เปลี่ยนไปใช้พวก db class อย่าง phpadodb ที่เป็น active record มันช่วยกัน sql injection ได้และโค้ดดูง่ายด้วย
ถ้าชำนาญขึ้นไปอีกก็เปลี่ยนไปใช้ framework เดี๋ยวนี้มีพวก ORM, active record, query builder มาให้ใช้เต็มไปหมด เลือกตามความเหมาะ
|
 |
 |
 |
 |
Date :
2014-09-11 07:27:34 |
By :
mr.v |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
สำหรับการป้องกัน SQL Injection ขอนำเสนอวิธีนี้ครับ mysql_real_escape_string
กรณีส่งข้อมูลมาแบบ POST
<?php
$_POST = array_map ('mysql_real_escape_string', $_POST);
$data = array(
'cal_id' => $_POST['cal_id'],
'ans_patient' => $_POST['ans'][0],
'ans_patient_csi' => $_POST['ans_patient_csi'],
'ans_patient_sum' => $_POST['ans_patient_sum']
);
$field = implode(', ', array_keys($data));
$value = "'". implode("', '", array_values($data)) . "'";
$sql = "INSERT INTO cal_info ($field) VALUES ($value)";
echo $sql;
?>
|
ประวัติการแก้ไข 2014-09-11 07:32:37
 |
 |
 |
 |
Date :
2014-09-11 07:32:08 |
By :
{Cyberman} |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
- orm ไม่เหมาะกับ query ที่ซับซ้อน มันช้า (แต่ insert คำสั่งเดียวยาวๆ แบบนี้ไม่มีปัญหา)
- ทำไมลองดูส่งค่าแบบ parameter หน่อยเหรอ php มันไปถึง v.5.6 แล้วนะ ยังต่อ string กันอยู่อีกหรือ
ใน database ข้อมูลมันมี type นะ ไม่ได้เหมือน php ดังนั้นส่งแบบ parameter แล้วระบุ type ไปด้วย
จะได้ไม่ต้องระวังข้อมูลแปลงผิด
- ทำไม table ใหญ่จัง ได้ทำ normalization หรือยังจ๊ะ
|
 |
 |
 |
 |
Date :
2014-09-11 08:35:32 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|