“ ประกาศ: ตัวแปรที่ไม่ได้กำหนด”,“ ประกาศ: ดัชนีที่ไม่ได้กำหนด” และ“ ประกาศ: ออฟเซตที่ไม่ได้กำหนด” โดยใช้ PHP


1173

ฉันกำลังเรียกใช้สคริปต์ PHP และยังคงได้รับข้อผิดพลาดเช่น:

แจ้งให้ทราบล่วงหน้า: ตัวแปรที่ไม่ได้กำหนด: my_variable_name ใน C: \ wamp \ www \ mypath \ index.php ในบรรทัดที่ 10

ประกาศ: ดัชนีที่ไม่ได้กำหนด: my_index C: \ wamp \ www \ mypath \ index.php ที่บรรทัด 11

บรรทัดที่ 10 และ 11 มีลักษณะดังนี้:

echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];

ข้อความแสดงข้อผิดพลาดเหล่านี้มีความหมายว่าอย่างไร?

ทำไมพวกเขาถึงปรากฏขึ้นทั้งหมดในทันที? ฉันเคยใช้สคริปต์นี้มานานหลายปีและฉันไม่เคยมีปัญหาใด ๆ เลย

ฉันจะแก้ไขได้อย่างไร


นี่เป็นคำถามอ้างอิงทั่วไปสำหรับคนที่จะเชื่อมโยงไปเป็นซ้ำกันแทนที่จะต้องอธิบายปัญหาซ้ำแล้วซ้ำอีก ฉันรู้สึกว่านี่เป็นสิ่งจำเป็นเพราะคำตอบในโลกแห่งความเป็นจริงในเรื่องนี้มีความเฉพาะเจาะจงมาก

การอภิปราย Meta ที่เกี่ยวข้อง:



3
ตัวแปรอาจไม่ได้รับการเริ่มต้น คุณกำลังเริ่มต้นตัวแปรจากโพสต์หรือรับหรืออาร์เรย์ใด ๆ หากเป็นกรณีนี้คุณอาจไม่มีเขตข้อมูลในอาร์เรย์นั้น ที่คุณเข้าถึง
Anish Silwal

3
@Pekka 웃 - ฉันสังเกตเห็นการแก้ไขเพิ่ม "และ" ประกาศ: ออฟเซตไม่ได้กำหนด "" - มันจะไม่ทำให้รู้สึกมากขึ้นโดยใช้ "PHP:" ตัวแปรที่ไม่ได้กำหนด "," ดัชนีที่ไม่ได้กำหนด "," ไม่ได้กำหนดออฟเซ็ต "ประกาศ" PHP ออกเพราะมันถูกติดแท็กเป็น "php" นอกจากนี้ URL จะถูกตัดออกand-notice-undefเพียงแค่คำแนะนำเพื่อที่ URL จะไม่ถูกตัดออกแม้แต่อาจลบเครื่องหมายคำพูด (มากเกินไป) หรือPHP: “Undefined variable/index/offset” notices
Funk Forty Niner

2
@ เฟรดฉันเดาว่าสามารถสร้างข้อโต้แย้งทั้งสองรูปแบบได้ มีโอกาสที่มือใหม่จะเข้าสู่บรรทัดทั้งหมดรวมถึง "ประกาศ:" ลงในคำค้นหาซึ่งฉันแน่ใจว่าเป็นตัวสร้างทราฟฟิกหลักสำหรับคำถามนี้ หากข้อความนั้นเต็มแสดงว่ามีแนวโน้มที่จะปรับปรุงการมองเห็นในเครื่องมือค้นหา
Pekka

2
@Pekka 웃ฉันเข้าใจ ฉันเพียงกล่าวว่าเนื่องจาก URL and-notice-undefไม่ได้รับการตัดออกไปก่อนและตอนนี้ก็ไม่ได้ที่ มันเป็นข้อเสนอแนะเพียงไม่กี่ข้อ Notice: Undefinedมันก็ซ้ำตัวเองที่ยังเป็น
Funk Forty Niner

คำตอบ:


1066

แจ้งให้ทราบล่วงหน้า: ตัวแปรที่ไม่ได้กำหนด

จากภูมิปัญญาอันกว้างใหญ่ของคู่มือ PHP :

การใช้ค่าดีฟอลต์ของตัวแปร uninitialized นั้นเป็นปัญหาในกรณีของการรวมไฟล์หนึ่งไปเป็นอีกไฟล์หนึ่งซึ่งใช้ชื่อตัวแปรเดียวกัน นอกจากนี้ยังเป็นที่สำคัญเสี่ยงด้านความปลอดภัยที่มีregister_globalsเปิด ข้อผิดพลาดระดับE_NOTICEถูกใช้ในกรณีที่ทำงานกับตัวแปรที่ไม่มีการกำหนดค่าเริ่มต้นอย่างไรก็ตามไม่ได้อยู่ในกรณีของการผนวกองค์ประกอบเข้ากับอาร์เรย์ที่ไม่ได้กำหนดค่าเริ่มต้น isset ()สร้างภาษาสามารถใช้ในการตรวจสอบว่าตัวแปรได้รับการเริ่มต้นแล้ว นอกจากนี้และอุดมคติอื่น ๆ คือโซลูชันของempty ()เนื่องจากไม่ได้สร้างคำเตือนหรือข้อความแสดงข้อผิดพลาดหากตัวแปรไม่ได้เริ่มต้น

จากเอกสาร PHP :

ไม่มีการสร้างคำเตือนหากไม่มีตัวแปร นั่นหมายความว่า empty ()คือความรัดกุมเทียบเท่ากับ! isset ($ var) || $ var == เท็จ

ซึ่งหมายความว่าคุณสามารถใช้เพียงempty()เพื่อตรวจสอบว่าตัวแปรที่มีการตั้งค่าและนอกจากมันจะตรวจสอบตัวแปรกับต่อไปนี้0, 0.0, "", "0", null, หรือfalse[]

ตัวอย่าง:

$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
    echo (!isset($v) || $v == false) ? 'true ' : 'false';
    echo ' ' . (empty($v) ? 'true' : 'false');
    echo "\n";
});

ทดสอบตัวอย่างข้างต้นในเครื่องมือแก้ไข PHP ออนไลน์ 3v4l.org

แม้ว่า PHP ไม่จำเป็นต้องมีการประกาศตัวแปร แต่ก็ขอแนะนำเพื่อหลีกเลี่ยงช่องโหว่ด้านความปลอดภัยหรือข้อบกพร่องที่ใคร ๆ ก็ลืมที่จะให้คุณค่ากับตัวแปรที่จะใช้ในสคริปต์ในภายหลัง สิ่งที่ PHP ทำในกรณีของตัวแปรที่ไม่ได้ประกาศคือข้อผิดพลาดระดับต่ำมากE_NOTICEซึ่งไม่ได้รายงานโดยค่าเริ่มต้น แต่คู่มือแนะนำให้อนุญาตในระหว่างการพัฒนา

วิธีจัดการกับปัญหา:

  1. แนะนำ:ประกาศตัวแปรของคุณเช่นเมื่อคุณพยายามผนวกสตริงเข้ากับตัวแปรที่ไม่ได้กำหนด หรือใช้isset()/ !empty() เพื่อตรวจสอบว่าพวกเขาจะประกาศก่อนที่จะอ้างอิงพวกเขาเช่นใน:

    //Initializing variable
    $value = ""; //Initialization value; Examples
                 //"" When you want to append stuff later
                 //0  When you want to add numbers later
    //isset()
    $value = isset($_POST['value']) ? $_POST['value'] : '';
    //empty()
    $value = !empty($_POST['value']) ? $_POST['value'] : '';
    

    สิ่งนี้กลายเป็นเรื่องที่สะอาดกว่าเดิมใน PHP 7.0 ตอนนี้คุณสามารถใช้โอเปอเรเตอร์รวมกันได้ :

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
    
  2. ตั้งค่าตัวจัดการข้อผิดพลาดที่กำหนดเองสำหรับ E_NOTICE และเปลี่ยนเส้นทางข้อความออกจากเอาต์พุตมาตรฐาน (อาจเป็นไฟล์บันทึก):

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
  3. ปิดใช้งาน E_NOTICE จากการรายงาน วิธีที่รวดเร็วในการยกเว้นเพียงแค่E_NOTICE:

    error_reporting( error_reporting() & ~E_NOTICE )
  4. ปราบปรามข้อผิดพลาดที่มีผู้ประกอบการ @

หมายเหตุ:ขอแนะนำอย่างยิ่งให้ติดตั้งเพียงจุดที่ 1

หมายเหตุ: ดัชนีที่ไม่ได้กำหนด / อ็อฟเซ็ตที่ไม่ได้กำหนด

ประกาศนี้ปรากฏขึ้นเมื่อคุณ (หรือ PHP) พยายามเข้าถึงดัชนีที่ไม่ได้กำหนดของอาร์เรย์

วิธีจัดการกับปัญหา:

  1. ตรวจสอบว่ามีดัชนีอยู่ก่อนที่คุณจะเข้าถึงหรือไม่ สำหรับสิ่งนี้คุณสามารถใช้isset()หรือarray_key_exists():

    //isset()
    $value = isset($array['my_index']) ? $array['my_index'] : '';
    //array_key_exists()
    $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
    
  2. โครงสร้างภาษาlist()อาจสร้างสิ่งนี้เมื่อพยายามเข้าถึงดัชนีอาร์เรย์ที่ไม่มีอยู่:

    list($a, $b) = array(0 => 'a');
    //or
    list($one, $two) = explode(',', 'test string');
    

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

แจ้งให้ทราบล่วงหน้า: ชดเชยที่ไม่ได้กำหนด: 1

$_POST/ $_GET/ $_SESSIONตัวแปร

ประกาศดังกล่าวข้างต้นปรากฏบ่อยเมื่อทำงานร่วมกับ$_POST, หรือ$_GET $_SESSIONสำหรับ$_POSTและ$_GETคุณเพียงแค่ต้องตรวจสอบว่ามีดัชนีอยู่หรือไม่ก่อนที่จะใช้พวกเขา สำหรับ$_SESSIONคุณต้องให้แน่ใจว่าคุณได้เซสชั่นเริ่มต้นด้วยsession_start()และว่าดัชนียังมีอยู่

โปรดทราบว่าตัวแปรทั้ง 3 ตัวเป็นsuperglobalsและเป็นตัวพิมพ์ใหญ่

ที่เกี่ยวข้อง:


7
@ dieselpower44 สองสามความคิด: "ตัวดำเนินการปิดระบบ" ( @) มีปัญหาประสิทธิภาพบางอย่าง นอกจากนี้เนื่องจากมันไม่แสดงข้อผิดพลาดทั้งหมดภายในขอบเขตที่เฉพาะเจาะจงการใช้งานโดยไม่สนใจอาจปิดบังข้อความที่คุณต้องการ
IMSoP

6
การซ่อนปัญหาไม่ใช่วิธีการจัดการกับปัญหา รายการ # 2 ... # 4 สามารถใช้งานได้เฉพาะบนเซิร์ฟเวอร์ที่ใช้งานจริงเท่านั้นไม่ใช่โดยทั่วไป
Salman

1
เป็นไปได้ไหมที่จะปิดข้อความอินไลน์ (ไม่ใช่ในตัวจัดการ) เมื่อใช้ตัวจัดการข้อผิดพลาดที่กำหนดเองด้วยเช่นกัน? $var = @$_GET['nonexisting'];ยังทำให้เกิดการแจ้งเตือน ..
Alph.Dev

18
ทำไมมันแนะนำให้ใช้ 1 $value = isset($_POST['value']) ? $_POST['value'] : '';แทนการใช้ 4. $value = @$_POST['value'];?
forsvunnet

@twistedpixel ทั้งสี่วิธีเป็นอิสระนั่นไม่ใช่คู่มือ 4 ขั้นตอน ดังนั้นหากคุณเลือกที่จะใช้วิธีที่ 4 นั่นหมายความว่าคุณยังไม่ได้ใช้งาน 3 วิธีแรกดังนั้นคุณยังไม่ได้ระงับข้อผิดพลาดใด ๆ
Aycan Yaşıt

141

ลองสิ่งเหล่านี้

Q1: ประกาศนี้หมายความว่า $ varname ไม่ได้ถูกกำหนดไว้ที่ขอบเขตปัจจุบันของสคริปต์

Q2: ใช้เงื่อนไข isset (), empty () ก่อนใช้ตัวแปรที่น่าสงสัยใด ๆ ทำงานได้ดี

// recommended solution for recent PHP versions
$user_name = $_SESSION['user_name'] ?? '';

// pre-7 PHP versions
$user_name = '';
if (!empty($_SESSION['user_name'])) {
     $user_name = $_SESSION['user_name'];
}

หรือเป็นวิธีแก้ปัญหาที่รวดเร็วและสกปรก:

// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);

หมายเหตุเกี่ยวกับการประชุม:

  • เมื่อใช้เซสชันsession_start();จำเป็นต้องวางไว้ในไฟล์ทั้งหมดที่ใช้เซสชัน

  • http://php.net/manual/en/features.sessions.php


หากใช้E_NOTICEจากphp.iniไฟล์กำหนดค่าให้ทำerror_reporting = (E_ALL & ~E_NOTICE)
ahmd0


จากคำตอบข้างต้นฉันลองใช้ isset แล้ว array_key_exists แต่มันไม่ทำงาน ฉันลองคำตอบของคุณ. ว่างเปล่า () และใช้งานได้ ขอบคุณมาก!
ewef

63

ผู้ประกอบการแสดงข้อผิดพลาด@

สำหรับประกาศที่ไม่ต้องการและซ้ำซ้อนใครสามารถใช้@โอเปอเรเตอร์เฉพาะเพื่อ» ซ่อน «ข้อความตัวแปร / ดัชนีที่ไม่ได้กำหนด

$var = @($_GET["optional_param"]);
  • สิ่งนี้มักจะหมดกำลังใจ ผู้มาใหม่มักจะใช้วิธีมากเกินไป
  • มันไม่เหมาะสมสำหรับรหัสที่ลึกลงไปในตรรกะของแอปพลิเคชัน (ไม่สนใจตัวแปรที่ไม่ได้ประกาศซึ่งคุณไม่ควรใช้) เช่นสำหรับพารามิเตอร์ฟังก์ชันหรือในลูป
  • มีหนึ่งคว่ำมากกว่าisset?:หรือ??super-supression อย่างไรก็ตาม ประกาศยังสามารถเข้าสู่ระบบได้ และหนึ่งอาจฟื้นคืนชีพ - @ประกาศที่ซ่อนอยู่กับ:set_error_handler("var_dump");
    • นอกจากนี้คุณไม่ควรใช้ / แนะนำเป็นประจำif (isset($_POST["shubmit"]))ในรหัสเริ่มต้นของคุณ
    • ผู้มาใหม่จะไม่เห็นความผิดพลาดดังกล่าว มันเป็นเพียงการกีดกันคุณเกี่ยวกับ PHPs Notices สำหรับกรณีเหล่านั้น เพิ่ม@หรือissetเฉพาะหลังจากการตรวจสอบการทำงาน
    • แก้ไขสาเหตุก่อน ไม่ใช่ข้อสังเกต

  • @ส่วนใหญ่เป็นที่ยอมรับสำหรับ$_GET/ $_POSTป้อนพารามิเตอร์เฉพาะถ้าพวกเขาไม่จำเป็นกำลัง

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

$_GET/ $_POST/ $_REQUESTไม่ได้กำหนดอินพุต

  • สิ่งแรกที่คุณทำเมื่อพบกับดัชนี / ออฟเซตที่ไม่ได้กำหนดคือการตรวจสอบความผิดพลาด:
    $count = $_GET["whatnow?"];

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

    var_dump($_GET);
    var_dump($_POST);
    //print_r($_REQUEST);
    

    ทั้งคู่จะเปิดเผยว่าสคริปต์ของคุณถูกเรียกใช้ด้วยสิทธิ์หรือพารามิเตอร์ใด ๆ เลย

  • ทางเลือกหรือใช้เบราว์เซอร์ devtools ( F12)เพิ่มเติมของคุณและตรวจสอบแท็บเครือข่ายเพื่อขอและพารามิเตอร์:

    เครื่องมือสำหรับนักพัฒนาเบราว์เซอร์ / แท็บเครือข่าย

    พารามิเตอร์ POST และอินพุต GET จะแสดงแยกต่างหาก

  • สำหรับ$_GETพารามิเตอร์คุณยังสามารถมองที่QUERY_STRINGใน

    print_r($_SERVER);

    PHP มีกฎบางอย่างในการรวมชื่อพารามิเตอร์ที่ไม่ได้มาตรฐานไว้ใน superglobals Apache อาจทำการเขียนใหม่เช่นกัน นอกจากนี้คุณยังสามารถดู$_COOKIESส่วนหัวคำขอ HTTP ที่ให้มาและอื่น ๆ ได้

  • ดูที่แถบที่อยู่เบราว์เซอร์ของคุณอย่างชัดเจนยิ่งขึ้นสำหรับพารามิเตอร์ GET :

    http://example.org/script.php?id=5&sort=desc

    name=valueคู่หลังจากที่?เครื่องหมายคำถามมีคำค้นหาของคุณ (GET) พารามิเตอร์ ดังนั้น URL นี้เท่านั้นอาจจะให้ผลผลิตและ$_GET["id"]$_GET["sort"]

  • สุดท้ายตรวจสอบ<form>และ<input>ประกาศของคุณหากคุณคาดหวังพารามิเตอร์ แต่ไม่ได้รับ

    • ตรวจสอบให้แน่ใจว่าแต่ละอินพุตที่จำเป็นมี <input name=FOO>
    • id=หรือtitle=แอตทริบิวต์ไม่พอเพียง
    • รูปแบบควรจะเติมmethod=POST$_POST
    • ในขณะที่method=GET(หรือปล่อยทิ้งไว้) จะให้$_GETตัวแปร
    • นอกจากนี้ยังเป็นไปได้สำหรับแบบฟอร์มการจัดหาaction=script.php?get=paramผ่าน $ _GET และmethod=POSTฟิลด์ที่เหลือใน $ _POST พร้อมกัน
    • ด้วยการกำหนดค่า PHP ที่ทันสมัย ​​(≥ 5.6) มันเป็นไปได้ (ไม่ใช่ความนิยม) ที่จะใช้$_REQUEST['vars']อีกครั้งซึ่งทำให้ GET และ POST param
  • หากคุณใช้งาน mod_rewrite คุณควรตรวจสอบทั้งaccess.logและเปิดใช้งานRewriteLogพารามิเตอร์เพื่อหาพารามิเตอร์ที่หายไป

$_FILES

$_COOKIE

  • $_COOKIEอาร์เรย์ไม่เคยมีประชากรขวาหลังจากsetcookie()แต่เมื่อขอติดตาม HTTP ใด ๆ
  • นอกจากนี้ความถูกต้องของหมดเวลาพวกเขาอาจถูก จำกัด ไปยังโดเมนย่อยหรือแต่ละเส้นทางและผู้ใช้และเบราว์เซอร์สามารถปฏิเสธหรือลบพวกเขา

2
หากคุณมีความอยากรู้อยากเห็นสิ่งที่เป็นผลกระทบต่อประสิทธิภาพบทความนี้สรุปได้ดีderickrethans.nl/...
Gajus

@GajusKuizinas มีการเปลี่ยนแปลงเล็กน้อยตั้งแต่ปี 2009 โดยเฉพาะอย่างยิ่งphp.net/ChangeLog-5.php#5.4.0เปลี่ยนแปลงผลลัพธ์อย่างมาก (ดู "Zend Engine, ประสิทธิภาพ" และ "(เงียบ))"
มาริโอ

ขอบคุณ @mario น่าสนใจ ตอนนี้ถ้ามีคนดีพอที่จะเปรียบเทียบทั้งสอง ... 3v4l.org/CYVOn/perf#tabs 3v4l.org/FLp3D/perf#tabsตามการทดสอบนี้ดูเหมือนจะเหมือนกัน (สังเกตว่าการเปลี่ยนแปลงของขนาด)
Gajus

47

โดยทั่วไปเพราะ "การเขียนโปรแกรมไม่ดี" และเป็นไปได้สำหรับข้อผิดพลาดในขณะนี้หรือในภายหลัง

  1. หากเป็นความผิดพลาดให้ทำการกำหนดตัวแปรให้เหมาะสมก่อน: $ varname = 0;
  2. หากมีการกำหนดบางครั้งจริงๆให้ทดสอบ: if (isset($varname))ก่อนใช้งาน
  3. หากเป็นเพราะคุณสะกดผิดให้แก้ไขให้ถูกต้อง
  4. บางทีอาจจะเปลี่ยนคำเตือนในการตั้งค่า PHP ของคุณ

5
โปรดอย่าปิดคำเตือน ในภาษาที่เข้มงวดพวกเขามักจะหมายถึง "อาจมีข้อผิดพลาดคุณควรตรวจสอบบรรทัดนี้สองครั้ง" - ในภาษาที่อนุญาตเท่า PHP พวกเขามักจะหมายถึง "รหัสนี้เป็นอึและเต็มไปด้วยปัญหาข้อบกพร่องฉันจะพยายาม มีความรู้สึกบางอย่าง แต่คุณควรแก้ไขโดยเร็วที่สุด "

5
แม้ว่าฉันจะเห็นด้วยกับสามคะแนนแรก แต่ # 4 นั้นผิด การซ่อนปัญหาจะไม่ทำให้หายไปและอาจทำให้เกิดปัญหามากขึ้นตามถนน
Valentin Flachsel

1
@ กรีกจริง ๆ แต่ในบางสถานการณ์ (ซื้อสคริปต์ความรู้ด้านเทคนิคเป็นศูนย์ต้องการให้มันทำงานในวันพรุ่งนี้ ... ) มันเป็นโซลูชันเทปพันท่อ - แย่มาก ๆ ที่ต้องเน้นเสมอ แต่ตัวเลือก
Pekka

เทปพันท่อนั้นดี ... บางครั้ง คำเตือนในอดีตได้รับการเปิดในการตั้งค่า PHP มาตรฐาน แต่การตั้งค่าการดูถูกนั้นเข้มงวดมากขึ้น น่าเสียดายที่หลายคนกลับไปใช้การตั้งค่าเดิมเพื่อไม่ให้ลูกค้ารำคาญใจ
Erik

41

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


34

ฉันไม่ต้องการปิดการแจ้งเตือนเพราะมีประโยชน์ แต่ต้องการหลีกเลี่ยงการพิมพ์มากเกินไป

ทางออกของฉันคือฟังก์ชั่นนี้:

function ifexists($varname)
{
  return(isset($$varname)?$varname:null);
}

ดังนั้นถ้าฉันต้องการอ้างอิง $ name และ echo ถ้ามีอยู่ฉันก็เขียน:

<?=ifexists('name')?>

สำหรับองค์ประกอบอาร์เรย์:

function ifexistsidx($var,$index)
{
  return(isset($var[$index])?$var[$index]:null);
}

ในหน้าถ้าฉันต้องการอ้างถึง $ _REQUEST ['name']:

<?=ifexistsidx($_REQUEST,'name')?>

2
ฟังก์ชัน ifexists () ของคุณใช้งานไม่ได้กับฉันใน PHP 5.3 ตัวแปรของผู้โทรไม่สามารถใช้งานได้ในขอบเขตท้องถิ่นของฟังก์ชั่น (ดูขอบเขตของตัวแปร ) ยกเว้นว่าเป็นSuperglobalsหรือคุณเล่นซอกับ$ GLOBALSดังนั้น$foo = "BABAR"; ifexists('foo');โดยทั่วไปจะคืนค่าว่าง (ตัว
เอน

ตอนนี้คุณจะได้รับ "สวัสดีจาก" ... ประเด็นคืออะไร? เพียงตรวจสอบค่าif( !empty($user) and !empty($location) ) echo "hello $user ..."
gcb

27

วิธีที่ดีที่สุดในการรับสายป้อนข้อมูลคือ:

$value = filter_input(INPUT_POST, 'value');

หนึ่งซับนี้เกือบเทียบเท่ากับ:

if (!isset($_POST['value'])) {
    $value = null;
} elseif (is_array($_POST['value'])) {
    $value = false;
} else {
    $value = $_POST['value'];
}

หากคุณต้องการค่าสตริงเช่น:

$value = (string)filter_input(INPUT_POST, 'value');

25

มันเป็นเพราะตัวแปร '$ user_location' ไม่ได้รับการกำหนด หากคุณกำลังใช้วงใด ๆ ถ้าภายในซึ่งคุณจะประกาศตัวแปร '$ user_location' แล้วคุณจะต้องมีวงอื่นและกำหนดเหมือนกัน ตัวอย่างเช่น:

$a=10;
if($a==5) { $user_location='Paris';} else { }
echo $user_location;

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

$a=10;
if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
echo $user_location;

25

ในการตอบกลับ "" เหตุใดจึงปรากฏขึ้นทันที ฉันเคยใช้สคริปต์นี้มานานหลายปีและฉันไม่เคยมีปัญหาใด ๆ เลย "

เป็นเรื่องปกติที่ไซต์ส่วนใหญ่จะทำงานภายใต้การรายงานข้อผิดพลาด "เริ่มต้น" ของ "แสดงข้อผิดพลาดทั้งหมด แต่ไม่ใช่" ประกาศ "และ" เลิกใช้แล้ว "" นี้จะถูกตั้งค่าใน php.ini และนำไปใช้กับเว็บไซต์ทั้งหมดบนเซิร์ฟเวอร์ ซึ่งหมายความว่า "ประกาศ" ที่ใช้ในตัวอย่างจะถูกระงับ (ซ่อนอยู่) ในขณะที่ข้อผิดพลาดอื่น ๆ ซึ่งมีความสำคัญมากกว่านั้นจะแสดง / บันทึกไว้

การตั้งค่าที่สำคัญอื่น ๆ คือข้อผิดพลาดที่สามารถซ่อนได้ (เช่นdisplay_errorsตั้งค่าเป็น "ปิด" หรือ "syslog")

สิ่งที่จะเกิดขึ้นในกรณีนี้คือสิ่งที่error_reportingถูกเปลี่ยนแปลงเพื่อแสดงการแจ้งเตือน (ตามตัวอย่าง) และ / หรือการตั้งค่าที่ถูกเปลี่ยนเป็นdisplay_errorsบนหน้าจอ (ตรงข้ามกับการระงับ / การบันทึกพวกเขา)

ทำไมพวกเขาถึงเปลี่ยน

คำตอบที่ชัดเจน / ง่ายที่สุดคือมีคนปรับการตั้งค่าเหล่านี้ใน php.ini หรือตอนนี้ PHP รุ่นอัพเกรดนั้นกำลังใช้ php.ini ที่ต่างไปจากเดิม นั่นคือสถานที่แรกที่มอง

อย่างไรก็ตามยังสามารถแทนที่การตั้งค่าเหล่านี้ใน

  • .htconf (การกำหนดค่าเว็บเซิร์ฟเวอร์รวมถึง vhosts และการกำหนดค่าย่อย) *
  • .htaccess
  • ในรหัส php ของตัวเอง

และสิ่งเหล่านี้อาจมีการเปลี่ยนแปลง

นอกจากนี้ยังมีความซับซ้อนที่เพิ่มขึ้นซึ่งการกำหนดค่าเว็บเซิร์ฟเวอร์สามารถเปิด / ปิดการใช้งานคำสั่ง. htaccess ได้ดังนั้นหากคุณมีคำสั่งใน. htaccess ที่เริ่ม / หยุดทำงานทันทีคุณต้องตรวจสอบสิ่งนั้น

(.htconf / .htaccess สมมติว่าคุณใช้เป็น apache หากใช้งานบรรทัดคำสั่งจะไม่มีผลถ้าใช้ IIS หรือเว็บเซิร์ฟเวอร์อื่นคุณต้องตรวจสอบการกำหนดค่าเหล่านั้นตามลำดับ)

สรุป

  • ตรวจสอบerror_reportingและdisplay_errorsคำสั่ง php ใน php.ini ไม่ได้เปลี่ยนแปลงหรือว่าคุณไม่ได้ใช้ php.ini ที่แตกต่างจากก่อนหน้านี้
  • ตรวจสอบerror_reportingและdisplay_errorsคำสั่ง php ใน. htconf (หรือ vhosts ฯลฯ ) ไม่เปลี่ยนแปลง
  • ตรวจสอบerror_reportingและdisplay_errorsคำสั่ง php ใน. htaccess ไม่ได้เปลี่ยน
  • หากคุณมีคำสั่งใน. htaccess ตรวจสอบว่าพวกเขายังคงได้รับอนุญาตในไฟล์. htconf
  • ในที่สุดตรวจสอบรหัสของคุณ อาจเป็นห้องสมุดที่ไม่เกี่ยวข้อง เพื่อดูว่าerror_reportingและdisplay_errorsมีการกำหนดคำสั่ง php หรือไม่

20

การแก้ไขด่วนคือการกำหนดตัวแปรของคุณให้เป็นโมฆะที่ด้านบนของรหัสของคุณ

$user_location = null;

16

ฉันเคยสาปแช่งข้อผิดพลาดนี้ แต่จะมีประโยชน์ในการเตือนให้คุณหลีกเลี่ยงการป้อนข้อมูลของผู้ใช้

ตัวอย่างเช่นหากคุณคิดว่านี่เป็นวิธีที่ชาญฉลาดรหัสย่อ:

// Echo whatever the hell this is
<?=$_POST['something']?>

...คิดอีกครั้ง! ทางออกที่ดีกว่าคือ:

// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>

(ฉันใช้html()ฟังก์ชั่นที่กำหนดเองเพื่อหลบหนีตัวละครระยะทางของคุณอาจแตกต่างกันไป)


15

ใน PHP 7.0 ตอนนี้เป็นไปได้ที่จะใช้ตัวดำเนินการรวม Null:

echo "My index value is: " . ($my_array["my_index"] ?? '');

เท่ากับ:

echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');

คู่มือ PHP PHP 7.0


นอกจากนี้ยังใช้งานได้ดีถ้างบ if (is_array($my_array['idontexist'] ?? '')) { dosomething(); }
coder

รหัสของคุณเป็นข้อผิดพลาดที่มองข้ามได้ดีจริง ๆ : ?? - ตรวจสอบเฉพาะisset()ถ้าคุณผ่านis_array()- ซึ่งเป็นบูลีนพฤติกรรมที่ไม่คาดคิดจะตามมา
elpiel

14

ฉันใช้ฟังก์ชันที่เป็นประโยชน์exst ()ของตัวเองตลอดเวลาซึ่งประกาศตัวแปรโดยอัตโนมัติ

รหัสของคุณจะเป็น -

$greeting = "Hello, ".exst($user_name, 'Visitor')." from ".exst($user_location);


/** 
 * Function exst() - Checks if the variable has been set 
 * (copy/paste it in any place of your code)
 * 
 * If the variable is set and not empty returns the variable (no transformation)
 * If the variable is not set or empty, returns the $default value
 *
 * @param  mixed $var
 * @param  mixed $default
 * 
 * @return mixed 
 */

function exst( & $var, $default = "")
{
    $t = "";
    if ( !isset($var)  || !$var ) {
        if (isset($default) && $default != "") $t = $default;
    }
    else  {  
        $t = $var;
    }
    if (is_string($t)) $t = trim($t);
    return $t;
}

14

ในมากภาษาที่เรียบง่าย
ข้อผิดพลาดคือคุณกำลังใช้ตัวแปร$user_locationที่คุณไม่ได้กำหนดไว้ก่อนหน้านี้และไม่มีค่าใด ๆ ดังนั้นฉันขอแนะนำให้คุณกรุณาประกาศตัวแปรนี้ก่อน ใช้งานตัวอย่างเช่น:


$user_location = '';
หรือ
$user_location = 'Los Angles';
นี่คือความผิดพลาดที่พบบ่อยมากที่คุณสามารถ face.So ไม่ต้องกังวลเพียงแค่ประกาศตัวแปรและเพลิดเพลินไปกับการเข้ารหัส


8

ทำไมไม่ทำสิ่งที่ง่าย

<?php
error_reporting(E_ALL); // making sure all notices are on

function idxVal(&$var, $default = null) {
         return empty($var) ? $var = $default : $var;
  }

echo idxVal($arr['test']);         // returns null without any notice
echo idxVal($arr['hey ho'], 'yo'); // returns yo and assigns it to array index, nice

?>

8

ทำไมถึงเกิดขึ้น?

เมื่อเวลาผ่านไป PHP ได้กลายเป็นภาษาที่เน้นความปลอดภัยมากขึ้น การตั้งค่าที่เคยถูกปิดโดยปริยายจะถูกเปิดใช้งานตามค่าเริ่มต้น ตัวอย่างที่สมบูรณ์แบบนี้อยู่E_STRICTซึ่งกลายเป็นที่เปิดโดยเริ่มต้น ณPHP 5.4.0

นอกจากนี้ตามค่าเริ่มต้นเอกสาร PHP E_NOTICEจะถูกปิดการใช้งานใน php.ini เอกสาร PHP ขอแนะนำให้เปลี่ยนมันสำหรับแก้จุดบกพร่องเพื่อ อย่างไรก็ตามเมื่อฉันดาวน์โหลด PHP จากที่เก็บ Ubuntu และจาก Windows ของ BitNami - ฉันเห็นอย่างอื่น

; Common Values:
;   E_ALL (Show all errors, warnings and notices including coding standards.)
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

ขอให้สังเกตว่าerror_reportingมีการตั้งค่าตามจริงเป็นค่าเริ่มต้นไม่ใช่ค่า "เริ่มต้น" เป็นค่าเริ่มต้น สิ่งนี้ค่อนข้างสับสนและไม่มีการบันทึกภายนอก php.ini ดังนั้นฉันจึงไม่ได้ตรวจสอบความถูกต้องนี้ในการแจกแจงอื่น

อย่างไรก็ตามหากต้องการตอบคำถามของคุณข้อผิดพลาดนี้จะปรากฏขึ้นทันทีเมื่อไม่ปรากฏขึ้นมาก่อนเนื่องจาก:

  1. คุณติดตั้ง PHP และตั้งค่าเริ่มต้นใหม่จะค่อนข้างเอกสารไม่ดี E_NOTICEแต่ไม่ได้ยกเว้น

  2. E_NOTICEคำเตือนเช่นตัวแปรที่ไม่ได้กำหนดและดัชนีที่ไม่ได้กำหนดจะช่วยทำให้โค้ดของคุณสะอาดและปลอดภัยยิ่งขึ้น ฉันสามารถบอกคุณได้ว่าเมื่อหลายปีก่อนการE_NOTICEเปิดใช้งานทำให้ฉันบังคับให้ประกาศตัวแปรของฉัน มันทำให้ง่ายขึ้นมากในการเรียนรู้ C, การไม่ประกาศตัวแปรนั้นยิ่งใหญ่กว่าความรำคาญ

ฉันจะทำอะไรเกี่ยวกับมันได้บ้าง?

  1. ปิดE_NOTICEโดยการคัดลอก "ค่าเริ่มต้น" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATEDและแทนที่ด้วยสิ่งที่ uncommented error_reporting =ขณะนี้หลังจากที่เท่ากับใน รีสตาร์ท Apache หรือ PHP ถ้าใช้ CGI หรือ FPM ตรวจสอบให้แน่ใจว่าคุณกำลังแก้ไข "ขวา" php.ini สิ่งที่ถูกต้องจะเป็น Apache หากคุณใช้ PHP กับ Apache, fpm หรือ php-fpm หากใช้ PHP-FPM, cgi หากใช้ PHP-CGI ฯลฯ นี่ไม่ใช่วิธีที่แนะนำ แต่ถ้าคุณมีรหัสดั้งเดิมที่จะไป จะยากเกินกว่าที่จะแก้ไขจากนั้นอาจเป็นทางออกที่ดีที่สุดของคุณ

  2. ปิดE_NOTICEไฟล์หรือระดับโฟลเดอร์ สิ่งนี้อาจจะดีกว่าถ้าคุณมีรหัสดั้งเดิม แต่ต้องการทำในสิ่งที่ "ถูกต้อง" เป็นอย่างอื่น ในการทำเช่นนี้คุณควรศึกษา Apache2, Nginx หรือเซิร์ฟเวอร์ที่คุณเลือก ใน Apache คุณจะใช้ภายในphp_value<Directory>

  3. เขียนโค้ดของคุณใหม่ให้สะอาดขึ้น หากคุณต้องทำสิ่งนี้ขณะที่ย้ายไปยังสภาพแวดล้อมการผลิตหรือไม่ต้องการให้ใครเห็นข้อผิดพลาดของคุณตรวจสอบให้แน่ใจว่าคุณกำลังปิดการแสดงข้อผิดพลาดและบันทึกเฉพาะข้อผิดพลาดของคุณเท่านั้น(ดูdisplay_errorsและlog_errorsใน php.ini และการตั้งค่าเซิร์ฟเวอร์ของคุณ) .

หากต้องการขยายตัวเลือก 3: นี่คืออุดมคติ หากคุณสามารถไปเส้นทางนี้คุณควร หากคุณไม่ได้ไปเส้นทางนี้ในตอนแรกให้พิจารณาย้ายเส้นทางนี้ในที่สุดโดยการทดสอบรหัสของคุณในสภาพแวดล้อมการพัฒนา ในขณะที่คุณอยู่ที่นั่นกำจัด~E_STRICTและ~E_DEPRECATEDเพื่อดูสิ่งที่อาจผิดไปในอนาคต คุณจะเห็นข้อผิดพลาดที่ไม่คุ้นเคยมากมาย แต่มันจะหยุดคุณจากปัญหาที่ไม่พึงประสงค์เมื่อคุณต้องการอัพเกรด PHP ในอนาคต

ข้อผิดพลาดหมายถึงอะไร

Undefined variable: my_variable_name- สิ่งนี้เกิดขึ้นเมื่อตัวแปรไม่ได้ถูกกำหนดก่อนการใช้งาน เมื่อเรียกใช้งานสคริปต์ PHP สคริปต์จะดำเนินการภายในค่าที่เป็นศูนย์เท่านั้น อย่างไรก็ตามในสถานการณ์ใดที่คุณต้องตรวจสอบตัวแปรก่อนที่จะถูกกำหนด? ในที่สุดนี่คืออาร์กิวเมนต์สำหรับ "รหัสเลอะเทอะ" ในฐานะนักพัฒนาซอฟต์แวร์ฉันสามารถบอกคุณได้ว่าฉันรักมันเมื่อฉันเห็นโครงการโอเพนซอร์ซที่มีการกำหนดตัวแปรให้สูงขึ้นในขอบเขตที่พวกเขาสามารถกำหนดได้ มันทำให้ง่ายต่อการบอกตัวแปรที่จะปรากฏขึ้นในอนาคตและทำให้ง่ายต่อการอ่าน / เรียนรู้รหัส

function foo()
{
    $my_variable_name = '';

    //....

    if ($my_variable_name) {
        // perform some logic
    }
}

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

// verbose way - generally better
if (isset($my_array['my_index'])) {
    echo "My index value is: " . $my_array['my_index'];
}

// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;   

ตัวเลือกอื่นคือการประกาศอาร์เรย์ว่างที่ด้านบนของฟังก์ชั่นของคุณ มันเป็นไปไม่ได้เสมอไป

$my_array = array(
    'my_index' => ''
);

//...

$my_array['my_index'] = 'new string';

(เคล็ดลับเพิ่มเติม)

  • เมื่อฉันพบปัญหาเหล่านี้และปัญหาอื่น ๆ ฉันใช้NetBeans IDE (ฟรี) และทำให้ฉันมีโฮสต์ของคำเตือนและประกาศ บางคนมีเคล็ดลับที่เป็นประโยชน์มาก นี่ไม่ใช่ข้อกำหนดและฉันไม่ได้ใช้ IDE อีกต่อไปยกเว้นโครงการขนาดใหญ่ vimวันนี้ฉันเป็นคนมากขึ้น:)

6

ดัชนีที่ไม่ได้กำหนดหมายถึงในอาร์เรย์ที่คุณร้องขอสำหรับดัชนีอาร์เรย์ที่ไม่พร้อมใช้งานเช่น

<?php 

$newArray[] = {1,2,3,4,5};
print_r($newArray[5]);

?>

ตัวแปรที่ไม่ได้กำหนดหมายถึงคุณได้ใช้ตัวแปรที่ไม่ได้มีอยู่ทั้งหมดหรือไม่ได้กำหนดหรือเริ่มต้นด้วยชื่อนั้น

<?php print_r($myvar); ?>

offset หมายถึงไม่ได้กำหนดในแถวลำดับที่คุณขอคีย์ที่ไม่มีอยู่ และทางออกสำหรับสิ่งนี้คือการตรวจสอบก่อนใช้งาน

php> echo array_key_exists(1, $myarray);

4

เกี่ยวกับส่วนนี้ของคำถาม:

ทำไมพวกเขาถึงปรากฏขึ้นทั้งหมดในทันที? ฉันเคยใช้สคริปต์นี้มานานหลายปีและฉันไม่เคยมีปัญหาใด ๆ เลย

ไม่มีคำตอบที่ชัดเจน แต่นี่เป็นคำอธิบายที่เป็นไปได้บางประการว่าทำไมการตั้งค่าสามารถเปลี่ยน 'ทันใด':

  1. คุณได้อัปเกรด PHP เป็นเวอร์ชันใหม่ซึ่งอาจมีค่าเริ่มต้นอื่น ๆ สำหรับ error_reporting, display_errors หรือการตั้งค่าอื่น ๆ ที่เกี่ยวข้อง

  2. คุณได้ลบหรือแนะนำรหัสบางส่วน (อาจขึ้นกับการพึ่งพา) ที่กำหนดการตั้งค่าที่เกี่ยวข้องในขณะใช้งานini_set()หรือerror_reporting()(ค้นหารหัสเหล่านี้ในรหัส)

  3. คุณเปลี่ยนการกำหนดค่าเว็บเซิร์ฟเวอร์ (สมมติว่า Apache ที่นี่): .htaccessไฟล์และการกำหนดค่า vhost ยังสามารถจัดการการตั้งค่า php

  4. โดยทั่วไปประกาศจะไม่แสดง / รายงาน (ดูคู่มือ PHP ) ดังนั้นจึงเป็นไปได้ว่าเมื่อตั้งค่าเซิร์ฟเวอร์ไฟล์ php.ini ไม่สามารถโหลดได้ด้วยเหตุผลบางอย่าง (การอนุญาตไฟล์ ??) และคุณได้ตั้งค่าเริ่มต้นแล้ว . ต่อมา 'ข้อผิดพลาด' ได้รับการแก้ไข (โดยไม่ได้ตั้งใจ) และตอนนี้มันสามารถโหลดไฟล์ php.ini ที่ถูกต้องพร้อมกับ error_reporting set เพื่อแสดงการแจ้งเตือน


3

หากทำงานกับคลาสคุณต้องแน่ใจว่าคุณอ้างอิงตัวแปรสมาชิกโดยใช้$this:

class Person
{
    protected $firstName;
    protected $lastName;

    public function setFullName($first, $last)
    {
        // Correct
        $this->firstName = $first;

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}

3

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

เช่น:

$query = "SELECT col1 FROM table WHERE col_x = ?";

จากนั้นพยายามเข้าถึงคอลัมน์ / แถวเพิ่มเติมภายในวง

เช่น:

print_r($row['col1']);
print_r($row['col2']); // undefined index thrown

หรือเป็นwhileวง:

while( $row = fetching_function($query) ) {

    echo $row['col1'];
    echo "<br>";
    echo $row['col2']; // undefined index thrown
    echo "<br>";
    echo $row['col3']; // undefined index thrown

}

สิ่งอื่นที่ต้องสังเกตคือใน * NIX OS และ Mac OS X ทุกอย่างจะต้องตรงตามตัวพิมพ์ใหญ่ - เล็ก

ศึกษาคำถามที่ถามบ่อยเกี่ยวกับกองซ้อน:


3

การใช้ternaryนั้นง่ายต่อการอ่านและทำความสะอาด:

Pre PHP 7
กำหนดตัวแปรให้กับค่าของตัวแปรอื่นหากมีการตั้งค่าไว้มิฉะนั้นจะกำหนดnull(หรือค่าเริ่มต้นที่คุณต้องการ):

$newVariable = isset($thePotentialData) ? $thePotentialData : null;

PHP 7+
เดียวกันยกเว้นใช้Null หลอมรวมผู้ประกอบการ ไม่จำเป็นต้องเรียกอีกต่อไปisset()เนื่องจากมีการสร้างขึ้นแล้วและไม่จำเป็นต้องจัดเตรียมตัวแปรเพื่อส่งคืนเนื่องจากจะถือว่าส่งคืนค่าของตัวแปรที่กำลังตรวจสอบ:

$newVariable = $thePotentialData ?? null;

ทั้งสองจะหยุดคำบอกกล่าวจากคำถาม OP และทั้งคู่จะเทียบเท่ากับ:

if (isset($thePotentialData)) {
    $newVariable = $thePotentialData;
} else {
    $newVariable = null;
}

 
หากคุณไม่ต้องการตั้งค่าตัวแปรใหม่คุณสามารถใช้ค่าที่ส่งคืนของ ternary ได้โดยตรงเช่นกับechoอาร์กิวเมนต์ของฟังก์ชัน ฯลฯ :

ก้อง:

echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';

ฟังก์ชั่น:

$foreName = getForeName(isset($userId) ? $userId : null);

function getForeName($userId)
{
    if ($userId === null) {
        // Etc
    }
}

ข้างต้นจะทำงานเหมือนกันกับอาร์เรย์รวมถึงเซสชัน ฯลฯ การแทนที่ตัวแปรที่ถูกตรวจสอบด้วยเช่น:
$_SESSION['checkMe']
หรือหลายระดับที่คุณต้องการเช่น:
$clients['personal']['address']['postcode']


 

การปราบปราม:

เป็นไปได้ที่จะระงับ PHP Notices ด้วย@หรือลดระดับการรายงานข้อผิดพลาดของคุณ แต่ไม่สามารถแก้ไขปัญหาได้ก็เพียงแค่หยุดการรายงานในบันทึกข้อผิดพลาด ซึ่งหมายความว่ารหัสของคุณยังคงพยายามใช้ตัวแปรที่ไม่ได้ตั้งค่าซึ่งอาจหรืออาจไม่ได้หมายความว่าบางสิ่งไม่ทำงานตามที่ต้องการ - ขึ้นอยู่กับความสำคัญของค่าที่ขาดหาย

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

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


1

สาเหตุหนึ่งที่พบบ่อยของตัวแปรที่ไม่มีอยู่หลังจากส่งแบบฟอร์มHTMLคือองค์ประกอบของแบบฟอร์มนั้นไม่มีอยู่ใน<form>แท็ก:

ตัวอย่าง: องค์ประกอบที่ไม่มีอยู่ใน <form>

<form action="example.php" method="post">
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

<select name="choice">
    <option value="choice1">choice 1</option>
    <option value="choice2">choice 2</option>
    <option value="choice3">choice 3</option>
    <option value="choice4">choice 4</option>
</select>

ตัวอย่าง: ตอนนี้องค์ประกอบมีอยู่ภายใน <form>

<form action="example.php" method="post">
    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

0

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


0

เมื่อจัดการกับไฟล์จำเป็นต้องมีประเภทของไฟล์และวิธีการ POST ที่เหมาะสมซึ่งจะทริกเกอร์การแจ้งเตือนดัชนีที่ไม่ได้กำหนดหากไม่รวมอยู่ในแบบฟอร์ม

คู่มือระบุไวยากรณ์พื้นฐานต่อไปนี้:

HTML

<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

PHP

<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>

อ้างอิง:


0

ฉันถามคำถามเกี่ยวกับเรื่องนี้และฉันถูกอ้างถึงโพสต์นี้ด้วยข้อความ:

คำถามนี้มีคำตอบอยู่ที่นี่แล้ว:

“ ประกาศ: ตัวแปรที่ไม่ได้กำหนด”,“ ประกาศ: ดัชนีที่ไม่ได้กำหนด” และ“ ประกาศ: ออฟเซตที่ไม่ได้กำหนด” โดยใช้ PHP

ฉันแบ่งปันคำถามและวิธีแก้ปัญหาของฉันที่นี่:

นี่เป็นข้อผิดพลาด:

ป้อนคำอธิบายรูปภาพที่นี่

บรรทัดที่ 154 เป็นปัญหา นี่คือสิ่งที่ฉันมีในบรรทัด 154:

153    foreach($cities as $key => $city){
154        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

ผมคิดว่าปัญหาคือการที่ผมเขียนถ้าเงื่อนไขตัวแปร$cityซึ่งไม่สำคัญ $key => $cityแต่ค่าใน ขั้นแรกคุณสามารถยืนยันได้ว่าเป็นสาเหตุของการเตือนหรือไม่ ประการที่สองหากเป็นปัญหาทำไมถึงไม่สามารถเขียนเงื่อนไขตามค่าได้ ต้องใช้รหัสที่ฉันต้องการเขียนเงื่อนไขหรือไม่

UPDATE 1: ปัญหาคือเมื่อเรียกใช้$citiesCounterArray[$key]งานบางครั้ง$keyคีย์จะสอดคล้องกับคีย์ที่ไม่มีอยู่ใน$citiesCounterArrayอาเรย์ สิ่งที่ฉันต้องการคือการตั้งเงื่อนไขเพื่อที่ว่าถ้า$keyมีอยู่ในอาร์เรย์แล้วเรียกใช้รหัสมิฉะนั้นข้ามมัน

อัปเดต 2: นี่คือวิธีแก้ไขโดยใช้array_key_exists():

foreach($cities as $key => $city){
    if(array_key_exists($key, $citiesCounterArray)){
        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

0

ข้อผิดพลาดเหล่านี้เกิดขึ้นทุกครั้งที่เราใช้ตัวแปรที่ไม่ได้ตั้งค่า

วิธีที่ดีที่สุดในการจัดการกับสิ่งเหล่านี้คือตั้งค่าการรายงานข้อผิดพลาดขณะที่การพัฒนา

วิธีตั้งค่าการรายงานข้อผิดพลาดใน:

ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);

ในเซิร์ฟเวอร์ที่ใช้งานจริงการรายงานข้อผิดพลาดจึงปิดดังนั้นเราจะไม่ได้รับข้อผิดพลาดเหล่านี้

อย่างไรก็ตามบนเซิร์ฟเวอร์การพัฒนาเราสามารถตั้งค่าการรายงานข้อผิดพลาดได้

เพื่อกำจัดข้อผิดพลาดนี้เราจะเห็นตัวอย่างต่อไปนี้:

if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;

เราสามารถเริ่มต้นตัวแปรNULLก่อนที่จะกำหนดค่าของพวกเขาหรือใช้พวกเขา

ดังนั้นเราสามารถปรับเปลี่ยนรหัสเป็น:

$test = NULL;
if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;

สิ่งนี้จะไม่รบกวนตรรกะของโปรแกรมใด ๆ และจะไม่สร้างการบอกกล่าวแม้ว่า$testจะไม่มีคุณค่าก็ตาม

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

และแก้ไขข้อผิดพลาดทั้งหมด

และในการผลิตควรรายงานข้อผิดพลาดเป็นปิด


-1

ประกาศเหล่านั้นเป็นเพราะคุณไม่มีตัวแปรที่ใช้definedและmy_indexคีย์ไม่ได้แสดงอยู่ใน$my_arrayตัวแปร

การแจ้งเตือนเหล่านั้นเกิดขึ้นทุกครั้งเนื่องจากคุณcodeไม่ถูกต้อง แต่คุณอาจไม่ได้มีการรายงานการแจ้งเตือน

แก้ข้อบกพร่อง:

$my_variable_name = "Variable name"; // defining variable
echo "My variable value is: " . $my_variable_name;

if(isset($my_array["my_index"])){
    echo "My index value is: " . $my_array["my_index"]; // check if my_index is set 
}

อีกวิธีในการทำให้สิ่งนี้เป็นจริง:

ini_set("error_reporting", false)

-2

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

//If you only want to check variable has value and value has true and false value.
//But variable must be defined first.

if($my_variable_name){

}

//If you want to check variable is define or undefine
//Isset() does not check that variable has true or false value
//But it check null value of variable
if(isset($my_variable_name)){

}

คำอธิบายง่ายๆ

//It will work with :- true,false,NULL
$defineVarialbe = false;
if($defineVarialbe){
    echo "true";
}else{
    echo "false";
}

//It will check variable is define or not and variable has null value.
if(isset($unDefineVarialbe)){
    echo "true";
}else{
    echo "false";
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.