ข้อความแจ้งข้อผิดพลาดของ PHP“ คำเตือน: การใช้ค่าคงที่ที่ไม่ได้กำหนด” หมายความว่าอย่างไร


163

PHP กำลังเขียนข้อผิดพลาดนี้ในบันทึก: "ประกาศ: ใช้ค่าคงที่ที่ไม่ได้กำหนด"

ข้อผิดพลาดในบันทึก:

PHP Notice:  Use of undefined constant department - assumed 'department' (line 5)
PHP Notice:  Use of undefined constant name - assumed 'name' (line 6)
PHP Notice:  Use of undefined constant email - assumed 'email' (line 7)
PHP Notice:  Use of undefined constant message - assumed 'message' (line 8)

บรรทัดของรหัสที่เกี่ยวข้อง:

$department = mysql_real_escape_string($_POST[department]);
$name = mysql_real_escape_string($_POST[name]);
$email = mysql_real_escape_string($_POST[email]);
$message = mysql_real_escape_string($_POST[message]);

มันหมายถึงอะไรและทำไมฉันเห็นมัน

คำตอบ:


217

คุณควรพูดคีย์อาเรย์ของคุณ:

$department = mysql_real_escape_string($_POST['department']);
$name = mysql_real_escape_string($_POST['name']);
$email = mysql_real_escape_string($_POST['email']);
$message = mysql_real_escape_string($_POST['message']);

ตามที่เป็นอยู่มันถูกมองหาค่าคงที่เรียกว่าdepartment, name, email, messageฯลฯ เมื่อไม่พบดังกล่าวอย่างต่อเนื่อง, PHP (พิกล) ตีความว่าเป็นสตริง ( 'แผนก' ฯลฯ ) เห็นได้ชัดว่าสิ่งนี้สามารถแตกหักได้ง่ายหากคุณกำหนดค่าคงที่ดังกล่าวในภายหลัง


มันหมายถึงตัวแปร $ _POST หรือไม่
Nik

3
@Col กระสุนเมื่อใดที่ฉันบอกว่าต้องใช้คีย์อาเรย์เท่านั้น เขาจำเป็นต้องพูดถึงกุญแจ แต่ไม่เพียง แต่มอบกุญแจ
Matthew Flaschen

1
ดีฉันหมายความว่าไม่จำเป็นต้องพูดคีย์อาเรย์ เราต้องพูดสตริงไม่ใช่คีย์อาเรย์ กุญแจไม่จำเป็นต้องมีการอ้างอิงพิเศษ
สามัญสำนึกของคุณ

4
มันไม่ใช่ "แปลกประหลาด" ... มันคือ "เข้ากันได้ย้อนหลัง" เดิมอนุญาตให้ใช้ PHP และแม้กระทั่งเลื่อนระดับโดยใช้สตริงที่ไม่ได้ระบุเป็นคีย์ (โอเคบางทีมันอาจจะยัง "แปลกประหลาด" :-)
Brian White

1
@BrianWhite ความจริงแล้วสนุกเมื่อเสนอที่จะเลิกใช้ฟังก์ชั่นนี้ฉันไม่สามารถหาหลักฐานได้ว่ามันได้รับการสนับสนุนอย่างเป็นทางการและมีเพียงรุ่นเบต้าของ PHP 3.0 เท่านั้นที่รวมพฤติกรรมดังกล่าวโดยไม่ต้องแจ้งให้ทราบล่วงหน้า ไม่เคยปล่อย อย่างไรก็ตามมันจะหายไปใน PHP 8.0 เมื่อใดก็ตามที่เข้ามา
IMSoP

77

ข้อความแสดงข้อผิดพลาดเกิดจากข้อเท็จจริงที่โชคร้ายที่ PHP จะประกาศโทเค็นที่ไม่รู้จักเป็นสตริงคงที่ในชื่อเดียวกัน

นั่นคือมันพยายามตีความสิ่งนี้ (สังเกตเครื่องหมายคำพูดที่หายไป):

$_POST[department]

วิธีที่ถูกต้องเพียงอย่างเดียวนี้จะเป็นไวยากรณ์ที่ถูกต้องใน PHP คือถ้าก่อนหน้านี้มีการdepartmentกำหนดค่าคงที่ น่าเศร้าแทนที่จะเสียชีวิตด้วยข้อผิดพลาดร้ายแรง ณ จุดนี้มันออกประกาศนี้และทำราวกับว่าค่าคงที่ได้ถูกกำหนดด้วยชื่อและค่าเดียวกัน:

// Implicit declaration of constant called department with value 'department'
define('department', 'department');  

มีหลายวิธีที่คุณจะได้รับข้อความแสดงข้อผิดพลาดนี้ แต่พวกเขาทั้งหมดมีสาเหตุเดียวกัน - โทเค็นที่อาจเป็นค่าคงที่

สตริงที่ไม่มีเครื่องหมายคำพูด: $my_array[bad_key]

นี่คือสิ่งที่เป็นปัญหาในกรณีของคุณและเป็นเพราะคุณมีคีย์อาร์เรย์ของสตริงที่ยังไม่ได้ถูกอ้างถึง การแก้ไขคีย์สตริงจะแก้ไขข้อบกพร่อง:

เปลี่ยนแปลง:

$department = mysql_real_escape_string($_POST[department]);
...(etc)...

ถึง:

$department = mysql_real_escape_string($_POST['department']);
...(etc)...

เครื่องหมายดอลลาร์ที่หายไปแบบแปรผัน: var_without_dollar

อีกเหตุผลที่คุณอาจเห็นข้อความแสดงข้อผิดพลาดนี้คือถ้าคุณละทิ้ง$จากตัวแปรหรือ$this->จากสมาชิก เช่นสิ่งใดสิ่งหนึ่งต่อไปนี้อาจทำให้เกิดข้อผิดพลาดที่คล้ายกัน:

my_local;   // should be $my_local
my_member;  // should be $this->my_member

อักขระไม่ถูกต้องในชื่อตัวแปร: $bad-variable-name

ปัญหาที่คล้ายกัน แต่ละเอียดกว่านี้อาจส่งผลให้คุณลองใช้อักขระที่ไม่ได้รับอนุญาตในชื่อตัวแปร - ยัติภังค์ ( -) แทนที่จะใช้เครื่องหมายขีดล่าง_จะเป็นกรณีทั่วไป

ตัวอย่างเช่นนี่คือตกลงเนื่องจากอนุญาตขีดล่างในชื่อตัวแปร :

if (123 === $my_var) {
  do_something();
}

แต่นี่ไม่ใช่:

if (123 === $my-var) {
  do_something();
}

มันจะถูกตีความเช่นเดียวกับสิ่งนี้:

if (123 === $my - var) {  // variable $my minus constant 'var'
  do_something();
}

อ้างถึงค่าคงที่คลาสโดยไม่ระบุขอบเขตคลาส

เพื่อที่จะหมายถึงระดับคงที่คุณจะต้องระบุขอบเขตของคลาสด้วย::ถ้าคุณพลาดนี้ปิด PHP define()จะคิดว่าคุณกำลังพูดถึงทั่วโลก

เช่น:

class MyClass {
  const MY_CONST = 123;

  public function my_method() {
    return self::MY_CONST;  // This is fine
  }


  public function my_method() {
    return MyClass::MY_CONST;  // This is fine
  }

  public function my_bad_method() {
    return MY_CONST;  // BUG - need to specify class scope
  }
}

การใช้ค่าคงที่ที่ไม่ได้กำหนดใน PHP เวอร์ชันนี้หรือกำหนดไว้ในส่วนขยายที่ไม่ได้ติดตั้ง

มีค่าคงที่ที่ระบบกำหนดบางอย่างที่มีอยู่ใน PHP รุ่นที่ใหม่กว่าเท่านั้นตัวอย่างเช่นค่าคงที่ตัวเลือกโหมดสำหรับround()เช่นPHP_ROUND_HALF_DOWNมีอยู่เฉพาะใน PHP 5.3 หรือใหม่กว่า

ดังนั้นหากคุณพยายามใช้คุณสมบัตินี้ใน PHP 5.2 ให้พูดว่า:

$rounded = round($my_var, 0, PHP_ROUND_HALF_DOWN);

คุณได้รับข้อความแสดงข้อผิดพลาดนี้:

การใช้ค่าคงที่ PHP_ROUND_HALF_DOWN ที่ไม่ได้กำหนด - สันนิษฐานว่า 'PHP_ROUND_HALF_DOWN' คำเตือน (2): นับพารามิเตอร์ผิดสำหรับรอบ ()


ขอบคุณสำหรับการแบ่งปัน ฉันพลาดself::ส่วนนั้นไป มันใช้งานได้แล้ว
moreirapontocom

ไม่ต้องสงสัยเลยว่าคำตอบนี้มีความครอบคลุมมากกว่าคำตอบอื่น ๆ และสมควรได้รับตราคำตอบที่ดีที่สุด! ฉันพลาดขอบเขตของคลาสและลงเอยด้วยการได้รับข้อมูลที่มีค่าสำหรับอนาคต ขอบคุณจอห์น!
Harish ST


3

คุณพลาดการใส่เครื่องหมายคำพูดเดี่ยวรอบ ๆ คีย์อาร์เรย์ของคุณ:

$ _POST [อีเมล]

ควรจะเป็น:

$ _POST [ 'อีเมล']


ควรเป็น $ _POST ['อีเมล'];
Ibnul Quayum

1

วิธีที่ถูกต้องในการใช้ตัวแปรโพสต์คือ

<?php

$department = $_POST['department'];

?>

ใช้ใบเสนอราคาเดียว (')


1
<?php 
  ${test}="test information";
  echo $test;
?>

แจ้งให้ทราบล่วงหน้า: การใช้การทดสอบคงที่ที่ไม่ได้กำหนด - สันนิษฐานว่า 'ทดสอบ' ใน D: \ xampp \ htdocs \ sp \ test \ envoirnmentVariables.php ในข้อมูลการทดสอบบรรทัดที่ 3


1

ใส่เครื่องหมายคำพูดเดี่ยว

ตัวอย่าง

$department = mysql_real_escape_string($_POST['department']);
$name = mysql_real_escape_string($_POST['name']);
$email = mysql_real_escape_string($_POST['email']);
$message = mysql_real_escape_string($_POST['message']); 

0

ฉันไม่แน่ใจว่ามีความแตกต่างใด ๆ หรือไม่ที่ใช้ตัวจุดประกายรหัสและฉันใช้ชื่อ "" และมันใช้งานได้ดี

$department = mysql_real_escape_string($_POST["department"]);
$name = mysql_real_escape_string($_POST["name"]);
$email = mysql_real_escape_string($_POST["email"]);
$message = mysql_real_escape_string($_POST["message"]);

ความนับถือ,

Jorge


1
ไม่มีความแตกต่างระหว่างคำพูดเดี่ยวและคู่ในกรณีนี้
Robbie Averill

1
@ RobbieAverill ในขณะที่ในกรณีนี้ในความเป็นจริงไม่มี - เป็นสตริงที่ยกมาเดี่ยวแสดงสิ่งที่เป็นที่สตริงอ้างคู่จะแยกตัวละครหนีและประเมินตัวแปรมันเป็นสไตล์ที่ดีที่จะใช้สตริงที่ยกมาเดียวในสถานการณ์นี้
Frankie

0

ดูเหมือนว่าค่าคงที่การดึงข้อมูลที่กำหนดไว้ล่วงหน้าจะหายไปพร้อมกับส่วนขยาย MySQL ดังนั้นเราต้องเพิ่มพวกมันก่อนฟังก์ชั่นแรก ...

// ค่าคงที่การดึงข้อมูลคงที่

define('MYSQL_BOTH',MYSQLI_BOTH);
define('MYSQL_NUM',MYSQLI_NUM);
define('MYSQL_ASSOC',MYSQLI_ASSOC);

ฉันทดสอบและประสบความสำเร็จ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.