|
|
|
การแจ้งเตือนผ่าน LineNotify แต่มี error ช่วยแก้หน่อยครับมือใหม่ทำโปรเจค |
|
|
|
|
|
|
|
สวัสดีครับ ผมเป็นมือใหม่ในการเขียนโค้ด ทำโปรเจคจบครับ ผมจะให้มันแจ้งเตือนในเงื่อนไขที่เป็น else แต่มันขึ้น error แบบนี้ ช่วยแก้ทีครับ
ส่วนนี้เป็นโค้ดครับ ผมเอา Tokenออกไว้นะครับ
Code (PHP)
<?php
include('database.php');
$b_field = $_POST["b_field"]; // สนาม
$b_date = $_POST["b_date"]; //วันที่จอง
$b_timestart = $_POST["b_timestart"]; //เริ่มจอง
$b_timeend = $_POST["b_timeend"]; // ถึงเวลา
$b_nidnumber = $_POST['b_nidnumber'];
$b_name = $_POST['b_name'];
$b_num = $_POST['b_num'];
$b_phone = $_POST['b_phone'];
$b_email = $_POST['b_email'];
$b_member = $_POST['b_member'];
//$strSQL = "SELECT * FROM book WHERE b_field = '".$b_field."' (b_date BETWEEN '".$b_timestart."' AND '".$b_timeend."')
//('".$b_timestart."' BETWEEN b_timestart AND b_timeend) OR ('".$b_timeend."' BETWEEN b_timestart AND b_timeend) ";
$strSQL = "SELECT * FROM book AS d1 INNER JOIN register AS d2 ON (d1.b_member = d2.id) WHERE (d1.b_field = '".$b_field."') AND (d1.b_date = '".$b_date."') AND (d1.b_timestart <='".$b_timeend."') AND (d1.b_timeend >='".$b_timestart."')";
$objQuery = mysqli_query($objConnect,$strSQL);
$objResult = mysqli_fetch_array($objQuery);
if ($objResult) {
echo "<script>
alert('มีคนจองแล้ว');
</script>";
exit;
} else {
$query = "INSERT INTO book (b_field,b_member,b_nidnumber,b_name,b_phone,b_email,b_date,b_timestart,b_timeend,b_num,b_reason,b_status)
VALUES ('".$b_field."','".$b_member."','".$b_nidnumber."','".$b_name."','".$b_phone."','".$b_email."','".$b_date."','".$b_timestart."','".$b_timeend."','".$b_num."',NULL,'1')";
$query_run = mysqli_query($objConnect,$query);
//แจ้งเตือนผ่านไลน์
define('LINE_API',"https://notify-api.line.me/api/notify");
$token = ""; //ใส่Token ที่copy เอาไว้
$str = "\r\n".'จองสนามเรียบร้อยแล้ว';
//ข้อความที่ต้องการส่ง สูงสุด 1000 ตัวอักษร
$res = notify_message($str,$token);
//print_r($res);
function notify_message($message,$token){
$queryData = array('message' => $message);
$queryData = http_build_query($queryData,'','&');
$headerOptions = array(
'http'=>array(
'method'=>'POST',
'header'=> "Content-Type: application/x-www-form-urlencoded\r\n"
."Authorization: Bearer ".$token."\r\n"
."Content-Length: ".strlen($queryData)."\r\n",
'content' => $queryData
),
);
$context = stream_context_create($headerOptions);
$result = file_get_contents(LINE_API,FALSE,$context);
$res = json_decode($result);
return $res;
}
//exit();
echo "<script>
alert('บันทึกสำเร็จ');
</script>";
exit;
}
?>
Tag : PHP
|
ประวัติการแก้ไข 2020-04-24 14:53:00
|
|
|
|
|
Date :
2020-04-24 14:50:41 |
By :
matines |
View :
2014 |
Reply :
13 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
วอนผู้รู้ช่วยทีครับ
|
ประวัติการแก้ไข 2020-04-24 14:53:58
|
|
|
|
Date :
2020-04-24 14:52:38 |
By :
matines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ต้องประกาศ function ก่อนเรียกใช้งานครับ
|
|
|
|
|
Date :
2020-04-24 15:01:29 |
By :
PhrayaDev |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Code (PHP)
<?php
if (1 == 2)
{
echo "NO in math.";
}
else
{
function writeMsg()
{ // ประกาศฟังก์ชันก่อน
echo "Hello world!";
}
writeMsg(); // เรียกฟังก์ชันหลังจากประกาศแล้ว
}
?>
หรือ
Code (PHP)
<?php
if (1 == 2)
{
echo "yes";
}
else
{
writeMsg();
}
// ประใน scope บน
function writeMsg()
{
echo "Hello world!";
}
?>
|
|
|
|
|
Date :
2020-04-29 17:10:52 |
By :
PhrayaDev |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Code (PHP)
if ($conditions) {
myFunction();
function myFunction() {
}
// ได้ call to undefined function
}
Code (PHP)
if ($conditions) {
function myFunction() {
}
myFunction();
// หาฟังก์ชั่นเจอ ทำงานได้
}
edit: แก้ไขหลังทดสอบแล้วมีปัญหากับเฉพาะ function ในเงื่อนไข.
คุณควรอ่านโค้ดให้เข้าใจด้วย แสดงว่าลอกมาอย่างเดียวไม่มีความเข้าใจเลย
การเรียกฟังก์ชั่น มันจะทำงานถ้ามันมีอยู่ ถ้าไม่มีก็จะแจ้งอย่างที่เห็น. ทั้งคห. 2 และผมก็บอกไปแล้วตรงกัน น่าจะเอะใจถ้าเข้าใจโค้ดบ้าง...
คือถ้ามันไปเรียกใช้เลยโดยไม่ได้ประกาศ หรือเรียกใช้ก่อนประกาศในเงื่อนไข มันก็จะลงเอยอย่างนี้.
อีกอย่าง การประกาศ function ควรแยกทำออกมาเป็นเอกเทศ ไม่ควรเอาไปซุกในเงื่อนไข
Code (PHP)
if ($conditions) {
function myFunction() {
// code
}
}
แบบนี้ผมยังไม่เคยเห็นใครเขาทำกัน ไปเปิดดูบน GitHub พวก Opensource ต่างๆที่คนทั่วโลกเขาเขียนก็ยังไม่ค่อยจะได้เห็นนะครับ.
เพราะมันดูไม่เป็นระเบียบ เลอะเทอะ ทำให้ซ้ำซ้อนได้
ยกเว้นแต่ว่าประกาศ function ในไฟล์ แล้วเอาไฟล์สั่ง include ในเงื่อนไข อันนั้นเคยเห็นบ่อย.
อ่านโค้ดให้เข้าใจ มันจะได้แก้ปัญหาได้ง่ายขึ้น ถ้าเข้าใจโค้ดมีคนบอกแค่นิดเดียว ก็เรียบร้อยไปแล้ว อย่าลอกอย่างเดียว เพราะบางทีต้นแบบคนเขียนให้ลอกก็ไม่ได้เขียนดีอะไร..
|
ประวัติการแก้ไข 2020-04-29 17:29:26 2020-04-29 18:01:03 2020-04-29 18:01:48
|
|
|
|
Date :
2020-04-29 17:28:57 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
จริงๆ แล้ว function อยู่ตรงไหน ก็เหมือนกัน จะอยู่ ต้นโปรแกรม จะอยู่ท้ายโปรแกรม ได้ทั้งนั้น
แค่ ขอให้อยู่ใน root อย่าอยู่ใน sub program มันจะมองไม่เห็น
แต่จากโค๊ดก็ไม่เข้าใจเหมือนกันทำไมมัน error undefined function ได้ แก้ไขอะไรเพิ่มเติมหรือเปล่า
ส่วน flow control ตรงนี้ผิด
Code (PHP)
$objQuery = mysqli_query($objConnect,$strSQL);
// $objResult = mysqli_fetch_array($objQuery); // บรรทัด ถ้าไม่มีข้อมูล (record เป็น 0) จะ error ลบออก
// if( $objResult ){ // ลบทิ้งเปลี่ยนเป็น
if( $objQuery->num_rows>0) {
exit("<script>alert('มีคนจองแล้ว');</script>"; // เขียนสั้นๆ ก็ได้ ถ้าจบโปรแกรมเลย
}
อีกอย่าง โค๊ด Query SQL แบบนี้ ถ้าเขียนใช้เอง มันก็ใช้ได้ แต่อย่าส่งลิงค์ให้ใครใช้ล่ะ
มันไม่ผ่าน security sql injection
|
|
|
|
|
Date :
2020-04-29 17:40:02 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
กรณีที่คุณ Chaidhanan ว่ามาก็ถูกครับ
ถ้าไฟล์เป็นแบบนี้
Code (PHP)
<?php
myFunction();// แสดงผล
function myFunction()
{
echo 'hello<br>' . PHP_EOL;
}
แบบนี้มันทำงานได้ครับ. คือตัวฟังก์ชั่นมันเป็น block level (ผมไม่ถนัดศัพท์เทคนิค อาจใช้คำผิด โปรดชี้แนะด้วย).
แต่ถ้ามันไปอยู่ในเงื่อนไขมันจะทำงานไม่ได้เลยครับ
Code (PHP)
<?php
if (!isset($undefinedVar)) {
myFunction();
function myFunction()
{
echo 'hello<br>' . PHP_EOL;
}
}
อาจเพราะไม่ใช่การประกาศใน block level แต่อยู่ในระดับที่ต่ำกว่าเลยต้องไล่ทำงานตามลำดับบนลงล่าง..
ดังนั้นถ้าเพื่อเอาให้แม่นๆแน่ๆ ก็เขียนประกาศ function ไว้ข้างนอกสุดอย่างที่ผมบอกอันก่อนอะครับ คือสร้างไฟล์สำหรับ functions ทั้งหลายเลย แล้ว include มาเรียกใช้.
ตัวอย่าง
Code (PHP)
<?php
function myFunction()
{
echo 'hello<br>' . PHP_EOL;
}
function myFunction2()
{
echo 'world<br>' . PHP_EOL;
}
functions.php
Code (PHP)
<?php
if ($condition1) {
include_once 'functions.php';
myFunction();
}
test01.php
แบบนี้จะแม่นยำไม่มีพลาดครับผม
|
ประวัติการแก้ไข 2020-04-29 17:57:52
|
|
|
|
Date :
2020-04-29 17:56:25 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แก้ไขโค๊ดบางตัว ลองดูเป็นตัวอย่างการ คิวรี่เพื่อป้องกัน sql injection พยามเขียนให้เคยชินเข้าไว้
ก็เฉพาะ ตัวแปรที่รับจากภายนอกนะครับ
Code (PHP)
<?php
include('database.php');
$b_field = $_POST["b_field"]; // สนาม
$b_date = $_POST["b_date"]; //วันที่จอง
$b_timestart = $_POST["b_timestart"]; //เริ่มจอง
$b_timeend = $_POST["b_timeend"]; // ถึงเวลา
$b_nidnumber = $_POST['b_nidnumber'];
$b_name = $_POST['b_name'];
$b_num = $_POST['b_num'];
$b_phone = $_POST['b_phone'];
$b_email = $_POST['b_email'];
$b_member = $_POST['b_member'];
//$strSQL = "SELECT * FROM book WHERE b_field = '".$b_field."' (b_date BETWEEN '".$b_timestart."' AND '".$b_timeend."')
//('".$b_timestart."' BETWEEN b_timestart AND b_timeend) OR ('".$b_timeend."' BETWEEN b_timestart AND b_timeend) ";
$strSQL = "
SELECT * FROM book AS d1 INNER JOIN register AS d2 ON (d1.b_member = d2.id)
WHERE (d1.b_field = ?) AND (d1.b_date = ?) AND (d1.b_timestart <= ?) AND (d1.b_timeend >= ?)";
$stmt = $objConnect->prepare($strSQL);
$stmt->bind_param('ssss', $b_field, $b_date, $b_timeend, $b_timestart);
$stmt->execute();
if ($stmt->num_rows>0){ exit('<script>alert('มีคนจองแล้ว');</script>'); }
$stmt->close();
//----------------------------------------------------
$query = "INSERT INTO book (b_field,b_member,b_nidnumber,b_name,b_phone,b_email,b_date,b_timestart,b_timeend,b_num,b_reason,b_status)
VALUES (?,?,?,?,?,?,?,?,?,?,NULL,'1')";
$stmt=$objConnect->prepare($query);
$stmt->bind_param('ssssssssss',$b_field,$b_member,$b_nidnumber,$b_name,$b_phone,$b_email,$b_date,$b_timestart,$b_timeend,$b_num);
$stmt->execute();
//แจ้งเตือนผ่านไลน์
define('LINE_API',"https://notify-api.line.me/api/notify");
$token = ""; //ใส่Token ที่copy เอาไว้
$str = "\r\n".'จองสนามเรียบร้อยแล้ว';
//ข้อความที่ต้องการส่ง สูงสุด 1000 ตัวอักษร
$res = notify_message($str,$token);
echo "<script>
alert('บันทึกสำเร็จ');
</script>";
//print_r($res);
function notify_message($message,$token){
$queryData = array('message' => $message);
$queryData = http_build_query($queryData,'','&');
$headerOptions = array(
'http'=>array(
'method'=>'POST',
'header'=> "Content-Type: application/x-www-form-urlencoded\r\n"
."Authorization: Bearer ".$token."\r\n"
."Content-Length: ".strlen($queryData)."\r\n",
'content' => $queryData
),
);
$context = stream_context_create($headerOptions);
$result = file_get_contents(LINE_API,FALSE,$context);
$res = json_decode($result);
return $res;
}
|
|
|
|
|
Date :
2020-04-29 20:50:46 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lab เพิ่มเติม
Code (PHP)
<?php
// .................
// function ใน Loop
// .................
for ($i=0; $i < 3; $i++) {
// Comment "if" จะได้ Cannot redeclare ...
// if ตรงนี้ป้องกันการประกาศฟังก์ชันซ้ำ
if ($i > 0) { // เงื่อนไขเหมือนกับ function_exists()
myFunction($i);
continue;
}
// ใน Block statement หรือ loop ต้องประกาศก่อนใช้
function myFunction($i)
{
echo "'hello $i'<br>";
}
myFunction($i); // บรรทัดนี้ถูกเรียกครั้งเดียวเมื่อ $i เป็น 0
}
// ........................................................
// แต่สำหรับ class เรียกก่อนหลังไม่สำคัญ เพราะถือว่าตัวแปรหรือฟังก์ชันอยู่ใน scope เดียวกัน
// ........................................................
$x = new myClass();
$x->b();
$x->d();
class myClass
{
function d() // เรียกก่อน
{
//echo $val; //undefined (no warning/error)
echo $this->val."from variable<br>";
}
public $val = "'hello in class'<br>";
function b() // เรียกก่อน
{
//a(); //undefined
$this->a();
}
function a()
{
echo $this->val;
}
function c() // เรียกหลัง
{
//a(); //undefined
$this->a();
}
}
$y = new myClass();
$y->c();
|
ประวัติการแก้ไข 2020-04-29 21:16:40
|
|
|
|
Date :
2020-04-29 21:14:40 |
By :
PhrayaDev |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอขอบคุณ คำแนะนำที่ให้เด็กหลังห้องแบบผมจากทุกท่านเลยนะครับ ผมจะลองไปประยุกแล้วปรับปรุงเพื่อใช้งานดูครับ ขอบคุณครับ
|
ประวัติการแก้ไข 2020-04-30 14:41:41
|
|
|
|
Date :
2020-04-30 14:33:33 |
By :
matines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 03
|