PHP භාවිතා කරමින් “දැනුම්දීම: නිර්වචනය නොකළ විචල්‍යය”, “දැනුම්දීම: නිර්වචනය නොකළ දර්ශකය” සහ “දැනුම්දීම: නිර්වචනය නොකළ ඕෆ්සෙට්”


1193

මම PHP ස්ක්‍රිප්ට් එකක් ධාවනය කරන අතර පහත සඳහන් දෝෂ ලැබෙනු ඇත:

සටහන: නිර්වචනය නොකළ විචල්‍යය: C හි my_variable_name: 10 වන පේළියේ \ wamp \ www \ mypath \ index.php

දැනුම්දීම: නිර්වචනය නොකළ දර්ශකය: 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"];

මෙම දෝෂ පණිවිඩවල තේරුම කුමක්ද?

ඔවුන් හදිසියේම පෙනෙන්නේ ඇයි? මම වසර ගණනාවක් මෙම ස්ක්‍රිප්ට් භාවිතා කළ අතර මට කිසි විටෙකත් කිසිදු ගැටළුවක් නොවීය.

මම ඒවා නිවැරදි කරන්නේ කෙසේද?


මෙය නැවත නැවතත් ගැටලුව පැහැදිලි කිරීම වෙනුවට අනුපිටපත් ලෙස සම්බන්ධ වීමට මිනිසුන්ට පොදු යොමු ප්‍රශ්නයකි . මෙම ගැටලුව පිළිබඳ සැබෑ ලෝකයේ බොහෝ පිළිතුරු ඉතා නිශ්චිත බැවින් මෙය අවශ්‍ය යැයි මට හැඟේ.

අදාළ මෙටා සාකච්ඡාව:



3
විචල්‍යය ආරම්භ කර නොතිබෙන්නට ඇත. ඔබ පෝස්ට් එකකින් විචල්‍යය ආරම්භ කරනවාද? එය එසේ නම් ඔබට එම අරාවෙහි ක්ෂේත්‍රයක් නොතිබිය හැකිය. ඔබේ ප්‍රවේශය.
අනීෂ් සිල්වාල්

3
EkPekka 웃 - සංස්කරණය "සහ" දැනුම්දීම: නිර්වචනය නොකළ ඕෆ්සෙට් "එකතු කිරීම මම දුටුවෙමි -" PHP: "නිර්වචනය නොකළ විචල්‍යය", "නිර්වචනය නොකළ දර්ශකය", "නිර්වචනය නොකළ ඕෆ්සෙට්" දැන්වීම් "භාවිතා කිරීම වඩා අර්ථවත් නොවේද? , PHP අතර, එය "php" ලෙස tagged බැවින් ප්ලස්, URL ඕෆ් 'හි කැපේ. and-notice-undef, හුදෙක් යෝජනාවක් URL එක කපා වන්නේ නැහැ එසේ බව සමහර විට පවා (බොහෝ) මිල කැඳවීම් ඉවත් කිරීම හෝ..PHP: “Undefined variable/index/offset” notices
ෆන්ක් හතලිස් නයිනර්

2
Red ෆ්‍රෙඩ් මා සිතන්නේ වෙනස්කම් දෙකටම තර්කයක් ඉදිරිපත් කළ හැකි බවයි. නවකයින් ඔවුන්ගේ සෙවුම් විමසුමට “දැනුම්දීම:” ඇතුළුව මුළු පේළියටම ඇතුළු වීමට අවස්ථාවක් තිබේ, මෙම ප්‍රශ්නයට ප්‍රධාන රථවාහන උත්පාදක යන්ත්රය මට විශ්වාසයි. පණිවිඩ සම්පුර්ණයෙන්ම තිබේ නම්, එය සෙවුම් යන්ත්‍රවල දෘශ්‍යතාව වැඩි දියුණු කිරීමට ඉඩ ඇත
Pekka

2
Ek පෙකා 웃 මට තේරෙනවා. මම එසේ කීවේ URL එක කලින් කපා නොතිබූ නිසා සහ දැන් එය ක්‍රියාත්මක වන and-notice-undefබැවිනි. එය යෝජනාවන් කිහිපයක් පමණි. එය යළිත් පුනරාවර්තනය වේ Notice: Undefined.
ෆන්ක් හතළිස් නිනර්

Answers:


1086

දැනුම්දීම: නිර්වචනය නොකළ විචල්‍යය

PHP අත්පොතේ අතිමහත් ප්‍ර wisdom ාවෙන් :

එකම විචල්‍ය නාමයක් භාවිතා කරන එක් ගොනුවක් තවත් ගොනුවකට ඇතුළත් කිරීමේදී, ආරම්භක නොවන විචල්‍යයක පෙරනිමි අගය මත රඳා සිටීම ගැටළු සහගතය. එය ද ප්රධාන වශයෙන් ආරක්ෂක අවදානම් සහිත ලෙස register_globals මත හැරී. ආරම්භක නොවන විචල්‍යයන් සමඟ වැඩ කිරීමේදී E_NOTICE මට්ටමේ දෝෂයක් නිකුත් කරනු ලැබේ, කෙසේ වෙතත් ආරම්භක අරාව වෙත මූලද්‍රව්‍ය එකතු කිරීමේදී නොවේ. විචල්‍යය දැනටමත් ආරම්භ කර ඇත්දැයි සොයා බැලීමට isset () භාෂා සැකැස්ම භාවිතා කළ හැකිය. අතිරේකව හා වඩා පරමාදර්ශී වන්නේ හිස් () විසඳුම වන අතර එය විචල්‍යය ආරම්භ නොකළහොත් අනතුරු ඇඟවීමක් හෝ දෝෂ පණිවිඩයක් ජනනය නොකරයි.

සිට PHP ප්රලේඛනය :

විචල්‍යය නොපවතී නම් අනතුරු ඇඟවීමක් ජනනය නොවේ. ඒ කියන්නේ හිස් () යනු සංක්ෂිප්තව ! නිකුත් කිරීම ($ 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";
});

3v4l.org මාර්ගගත PHP සංස්කාරකයේ ඉහත ස්නිපටය පරීක්ෂා කරන්න

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 වන විට මෙය වඩා පිරිසිදු වී ඇත, දැන් ඔබට ශුන්‍ය coalesce operator භාවිතා කළ හැකිය :

    // 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 සුපිරි ග්ලෝබල් වන අතර ඒවා ලොකු අකුරු බව සලකන්න .

ආශ්‍රිත:


7
@ ඩීසල්පවර් 44 සිතුවිලි කිහිපයක්: "වසා දැමීමේ ක්‍රියාකරු" ( @) හට කාර්ය සාධන ගැටළු කිහිපයක් ඇත. එසේම, එය කිසියම් විෂය පථයක් තුළ ඇති සියලුම දෝෂයන් මැඩපවත්වන හෙයින්, එය නොසැලකිලිමත් ලෙස භාවිතා කිරීමෙන් ඔබ දැකීමට කැමති පණිවිඩ වසං කළ හැකිය.
IMSoP

6
ගැටළු සැඟවීම ගැටළු සමඟ කටයුතු කිරීමේ මාර්ගය නොවේ. අයිතම # 2 ... # 4 භාවිතා කළ හැක්කේ නිෂ්පාදන සේවාදායකයන් මත මිස පොදුවේ නොවේ.
සල්මාන් ඒ

1
අභිරුචි දෝෂ හසුරුවන්නෙකු භාවිතා කරන විට පණිවුඩය පේළියේ (හසුරුවන්නාගේ නොවේ) වසා දැමිය හැකිද? $var = @$_GET['nonexisting'];තවමත් දැනුම් දීමක් කරයි ..
ඇල්ෆ් දේව්

18
$value = isset($_POST['value']) ? $_POST['value'] : '';4 භාවිතා කිරීම වෙනුවට 1. භාවිතා කිරීම නිර්දේශ කරන්නේ ඇයි $value = @$_POST['value'];?
forsvunnet

wtwistedpixel එම ක්‍රම 4 ස්වාධීන වේ, එය පියවර 4 ක මාර්ගෝපදේශයක් නොවේ. එබැවින් ඔබ 4 වන මාර්ගය භාවිතා කිරීමට තෝරාගෙන තිබේ නම්, එයින් අදහස් වන්නේ ඔබ පළමු ක්‍රම 3 ක්‍රියාත්මක නොකළ බවයි, එබැවින් ඔබ තවමත් කිසිදු දෝෂයක් මැඩපවත්වා නැත.
අයිකන් යාට්

141

මේවා උත්සාහ කරන්න

Q1: මෙම දැන්වීමෙන් අදහස් වන්නේ ස්ක්‍රිප්ටයේ වත්මන් විෂය පථය තුළ $ varname අර්ථ දක්වා නොමැති බවයි.

Q2: සැක සහිත විචල්‍යයක් භාවිතා කිරීමට පෙර නිකුත් කිරීමේ (), හිස් () කොන්දේසි හොඳින් ක්‍රියාත්මක වේ.

// 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.session.php


භාවිතා කරන්නේ නම් E_NOTICEවලින් php.iniමානකරන ගොනුව, කරන්නerror_reporting = (E_ALL & ~E_NOTICE)
ahmd0


ඉහත පිළිතුරෙන්, මම නිකුත් කිරීම, අරා_කී_එක්සිස්ට් උත්සාහ කර ඇති නමුත් ඒවා ක්‍රියාත්මක වූයේ නැත. මම ඔබේ පිළිතුර උත්සාහ කළෙමි .empty (), එය ක්‍රියාත්මක වේ. බොහොම ස්තූතියි!

63

දෝෂ දර්ශන @ක්‍රියාකරු

අනවශ්‍ය හා අතිරික්ත දැන්වීම් සඳහා, නිර්වචනය නොකළ විචල්‍ය / දර්ශක පණිවිඩ » සැඟවීමට « කැපවූ @ක්‍රියාකරු භාවිතා කළ හැකිය .

$var = @($_GET["optional_param"]);
  • මෙය සාමාන්‍යයෙන් අධෛර්යමත් වේ. නවකයන් එය අධික ලෙස භාවිතා කිරීමට නැඹුරු වෙති.
  • යෙදුම් තර්කනය තුළ ගැඹුරු කේත සඳහා එය ඉතා නුසුදුසු ය (ඔබ නොකළ යුතු ස්ථානවල ප්‍රකාශයට පත් නොකළ විචල්‍යයන් නොසලකා හැරීම), උදා: ක්‍රියාකාරී පරාමිතීන් සඳහා හෝ ලූපවල.
  • කෙසේ වෙතත් එක් උඩු යටිකුරු කිරීමක් isset?:හෝ ??සුපිරි මර්ධනයක් ඇත. දැන්වීම් තවමත් ලොග් විය හැක. යමෙකුට @සැඟවුණු දැන්වීම් නැවත නැඟිටුවිය හැකිය :set_error_handler("var_dump");
    • if (isset($_POST["shubmit"]))ඔබේ ආරම්භක කේතය පුරුද්දක් ලෙස භාවිතා කිරීම / නිර්දේශ කිරීම නොකළ යුතුය .
    • නවකයන්ට එවැනි යතුරු ලියනය සොයාගත නොහැක. එම අවස්ථා වලදී ඔබට PHPs දැන්වීම් අහිමි වේ. එකතු කිරීම @හෝ ක්‍රියාකාරීත්වය සත්‍යාපනය කිරීමෙන් පසුව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 හට නීති කිහිපයක් තිබේ . අපාචේ විසින් නැවත ලිවීමද කළ හැකිය. ඔබට සැපයූ අමු $_COOKIESසහ වෙනත් HTTP ඉල්ලීම් ශීර්ෂයන් ඒ ආකාරයෙන් බැලීමටද හැකිය.

  • GET පරාමිතීන් සඳහා වඩාත් පැහැදිලිව ඔබගේ බ්‍රව්සර ලිපින තීරුව දෙස බලන්න :

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

    මෙම name=valueපසු යුගල ?ප්රශ්නාර්ථ ලකුණ ඔබගේ විමසුමට (ලබා ගන්න) පරාමිතීන් ඇත. මේ අනුව මෙම URL සමහර විට එතනිනුත් $_GET["id"]හා $_GET["sort"].

  • ඔබ පරාමිතියක් අපේක්ෂා කළත් කිසිවක් නොලැබෙන්නේ නම් අවසාන වශයෙන් ඔබගේ <form>සහ<input> ප්‍රකාශන පරීක්ෂා කරන්න .

    • අවශ්‍ය සෑම ආදානයකටම ඇති බව සහතික කරන්න <input name=FOO>
    • මෙම id=හෝ title=විශේෂණය පමනක් ප්රමානවත් නොවේ.
    • method=POSTආකෘති පත්රය මගින් පිරවිය යුතු $_POST.
    • A method=GET(හෝ එය අතහැර දැමීම) $_GETවිචල්‍යයන් ලබා දෙන අතර.
    • පෝරමයක් සඳහා action=script.php?get=param$ _GET හරහා සහ ඉතිරි method=POSTක්ෂේත්‍ර $ _POST හරහා සැපයිය හැකිය .
    • නවීන PHP මානකරණ (≥ 5.6) සමග එය බවට පත් වී තිබේ පොදු අවකාශයක් ද භාවිතා කිරීමට (විලාසිතාවක් නොවේ) $_REQUEST['vars']mashes GET සහ POST params වන, නැවත.
  • ඔබ mod_rewrite භාවිතා කරන්නේ නම්, ඔබ ඒ දෙකම පරික්ෂා කළ යුතු අතර නැති පරාමිතීන් access.logහඳුනා ගැනීමට සක්‍රීය කළ RewriteLogයුතුය.

$_FILES

  • ගොනු උඩුගත කිරීම් සඳහා එකම සනීපාරක්ෂක චෙක්පත් අදාළ වේ $_FILES["formname"].
  • එපමණක් නොව පරීක්ෂා කරන්න enctype=multipart/form-data
  • method=POSTඔබේ <form>ප්‍රකාශයේ මෙන්ම .
  • මෙයද බලන්න: PHP නිර්වචනය නොකළ දර්ශක දෝෂයක් $ _FILES?

$_COOKIE

  • මෙම $_COOKIEඅරාව අයිතිය පසු ජනාකීර්ණ නැහැ ඇත setcookie(), නමුත් කිසිදු followup HTTP ඉල්ලීම මත.
  • මීට අමතරව ඒවායේ වලංගු කාලය ඉකුත්වී ඇති අතර, ඒවා උප ඩොමේන් හෝ තනි මාර්ග වලට බාධාවක් විය හැකි අතර පරිශීලකයාට සහ බ්‍රව්සරයට ඒවා ප්‍රතික්ෂේප කිරීමට හෝ මකා දැමීමට හැකිය.

2
කාර්ය සාධන බලපෑම කුමක්දැයි ඔබ කුතුහලයෙන් සිටී නම්, මෙම ලිපිය එය හොඳින් සාරාංශ කරයි, derickrethans.nl/… .
ගජස්

AjajusKuizinas 2009 සිට බොහෝ වෙනස්කම් සිදුවී ඇත, විශේෂයෙන් php.net/ChangeLog-5.php#5.4.0 ප්‍රති come ලය විශාල ලෙස වෙනස් කරයි ("සෙන්ඩ් එන්ජින්, කාර්ය සාධනය" සහ "(නිහ silence) ක්‍රියාකරු" බලන්න).
මාරියෝ

ස්තූතියි @ මාරියෝ, රසවත්. දැන්, යමෙකු දෙදෙනා මිණුම් සලකුණු කිරීමට තරම් හොඳ නම් ... 3v4l.org/CYVOn/perf#tabs 3v4l.org/FLp3D/perf#tabs මෙම පරීක්ෂණයට අනුව, සමාන බව පෙනේ (පරිමාණ වෙනස්වීම් සැලකිල්ලට ගන්න).
ගජස්

47

සාමාන්‍යයෙන් "නරක ක්‍රමලේඛනය" නිසා සහ දැන් හෝ පසුව වැරදි සිදුවීමට ඉඩ ඇත.

  1. එය වැරැද්දක් නම්, පළමුව විචල්‍යයට නිසි පැවරුමක් කරන්න: $ varname = 0;
  2. එය ඇත්ත වශයෙන්ම සමහර විට පමණක් අර්ථ දක්වා ඇත්නම්, ඒ සඳහා පරීක්ෂා කරන්න : if (isset($varname)), එය භාවිතා කිරීමට පෙර
  3. එය ඔබ වැරදි ලෙස අක්ෂර වින්‍යාසය නිසා නම්, එය නිවැරදි කරන්න
  4. සමහර විට ඔබ තුළ ඇති අනතුරු ඇඟවීම් PHP සැකසුම් වල පවා හරවන්න

5
කරුණාකර අනතුරු ඇඟවීම් අක්‍රිය නොකරන්න. දැඩි භාෂාවලින්, ඔවුන් බොහෝ විට අදහස් කරන්නේ "දෝෂයක් තිබිය හැකිය, ඔබ මෙම රේඛාව දෙවරක් පරික්ෂා කිරීම වඩා හොඳය" - PHP තරම් අවසර ලත් භාෂාවක, ඔවුන් බොහෝ විට අදහස් කරන්නේ "මෙම කේතය කපටි සහ දෝෂ වලින් පිරී ඇති බවය; මම සෑදීමට උත්සාහ කරමි ඒ පිළිබඳ යම් හැඟීමක් ඇති නමුත් ඔබ මෙම ASAP නිවැරදි කිරීම වඩා හොඳය.

5
මම පළමු කරුණු තුන සමඟ එකඟ වුවද, # 4 සරලවම වැරදිය. ගැටලුවක් සැඟවීමෙන් එය ඉවතට නොයනු ඇති අතර, එය තවත් ගැටලු පාරට බැසීමට ඉඩ ඇත.
වැලන්ටින් ෆ්ලැච්සෙල්

1
Really සත්‍ය වශයෙන්ම සත්‍යය, නමුත් සමහර අවස්ථාවන්හිදී (ස්ක්‍රිප්ට්, ශුන්‍ය තාක්ෂණික දැනුම, එය හෙට වන විට ක්‍රියාත්මක විය යුතුය ...) එය ඩක්-ටේප් විසඳුමයි - ඇත්තෙන්ම නරකයි, එය සැමවිටම අවධාරණය කළ යුතු නමුත් විකල්පයක්
පෙකා

ඩක්-ටේප් හොඳයි ... සමහර විට. PHP තිහාසික අනතුරු ඇඟවීම් සම්මත PHP සැකසුම් තුළ හැරී ඇත, නමුත් අපැහැදිලි සැකසුම් වඩාත් දැඩි වී ඇත. ගනුදෙනුකරුවන්ට කරදර නොකිරීමට බොහෝ අය පැරණි සැකසුම් වෙත ආපසු යති.
එරික්

41

එයින් අදහස් වන්නේ ඔබ තවමත් කිසිවක් පවරා නොමැති විචල්‍යයක් පරීක්ෂා කිරීම, ඇගයීම හෝ මුද්‍රණය කිරීමයි. එයින් අදහස් වන්නේ ඔබට යතුරු ලියනයක ඇති බවයි, නැතහොත් විචල්‍යය මුලින් යම් දෙයකට ආරම්භ කර ඇත්දැයි පරීක්ෂා කර බැලිය යුතුය. ඔබේ තාර්කික මාර්ග පරීක්ෂා කරන්න, එය එක් මාර්ගයක සැකසිය හැකි නමුත් වෙනත් මාර්ගයක නොවේ.


34

දැන්වීම අක්‍රීය කිරීමට මට අවශ්‍ය නොවූයේ එය ප්‍රයෝජනවත් නිසා, නමුත් ඕනෑවට වඩා යතුරු ලියනය කිරීමෙන් වැළකී සිටීමටයි.

මගේ විසඳුම වූයේ මෙම කාර්යයයි:

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

එබැවින් මට $ නම සහ දෝංකාරය සඳහන් කිරීමට අවශ්‍ය නම්, මම සරලව ලියමි:

<?=ifexists('name')?>

අරාව මූලද්‍රව්‍ය සඳහා:

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

පිටුවේ මට RE _REQUEST ['name'] වෙත යොමු වීමට අවශ්‍ය නම්:

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

2
PHP 5.3 හි ඔබගේ ifexists () ශ්‍රිතය මට වැඩ නොකරයි. ඇමතුම්කරුගේ විචල්‍යයන් ශ්‍රිතයේ දේශීය විෂය පථයේ නොමැත ( විචල්‍ය විෂය පථය බලන්න ), ඒවා සුපර් ග්ලෝබල් හෝ ඔබ $ ග්ලෝබල් සමඟ සම්බන්ධ නොවන්නේ නම් , $foo = "BABAR"; ifexists('foo');සාමාන්‍යයෙන් ශුන්‍ය වනු ඇත. (ඇල අකුරු php.net පරිච්ඡේද වේ.)
skierpage

දැන් ඔබට "ආයුබෝවන්" ලැබෙනු ඇත ... එහි තේරුම කුමක්ද? වටිනාකම පරීක්ෂා කරන්න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;

ඉහත කේතය දෝෂයක් ඇති කරයි නම් if loop එක සෑහීමකට පත් නොවන අතර අනෙක් පුඩුවේ '$ 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"ඕෆ්" හෝ "සයිස්ලොග්" ලෙස සකසා ඇත).

මෙම නඩුවේ කුමක් සිදුවනු ඇත්ද යන්න එක්කෝ error_reportingදැනුම් දීම් පෙන්වීම සඳහා වෙනස් කර ඇත (උදාහරණ අනුව) සහ / හෝ සැකසුම් display_errorsතිරය ​​මත වෙනස් කර ඇත (ඒවා යටපත් කිරීමට / ලොග් වීමට වඩා වෙනස්ව).

ඔවුන් වෙනස් වී ඇත්තේ ඇයි?

පැහැදිලි / සරලම පිළිතුර නම් යමෙකු මෙම සැකසුම් වලින් එකක් php.ini හි සකස් කර ඇති බවයි, නැතහොත් PHP හි වැඩි දියුණු කරන ලද අනුවාදයක් දැන් පෙර සිට වෙනස් php.ini භාවිතා කරයි. බැලීමට පළමු ස්ථානය එයයි.

කෙසේ වෙතත් මෙම සැකසුම් අභිබවා යාමට ද හැකිය

  • .htconf (වෙබ් සේවාදායක වින්‍යාසය, වොස්ට් සහ උප වින්‍යාසයන් ඇතුළුව) *
  • .htaccess
  • php කේතයේම

මේවායින් කිසිවක් වෙනස් කිරීමට ඉඩ තිබුණි.

වෙබ් සේවාදායක වින්‍යාසය මඟින් .htaccess විධානයන් සක්‍රිය / අක්‍රීය කළ හැකි අමතර සංකූලතාවයක් ද ඇත, එබැවින් ඔබට .htaccess හි විධානයන් තිබේ නම් හදිසියේම ආරම්භ වන / වැඩ කිරීම නවත්වන විට ඔබ ඒ සඳහා පරීක්ෂා කළ යුතුය.

(.htconf / .htaccess උපකල්පනය කරන්නේ ඔබ අපාචේ ලෙස ධාවනය වන බවයි. විධාන රේඛාව ධාවනය කරන්නේ නම් මෙය අදාළ නොවේ; IIS හෝ වෙනත් වෙබ් සේවාදායකයක් ධාවනය කරන්නේ නම් ඒ අනුව ඔබ එම වින්‍යාසයන් පරීක්ෂා කළ යුතුය)

සාරාංශය

  • Php.ini හි පරීක්ෂා කිරීම error_reportingසහ display_errorsphp විධානයන් වෙනස් වී නැත, නැතහොත් ඔබ පෙර සිට වෙනත් php.ini භාවිතා නොකරයි.
  • .Htconf (හෝ vhosts etc) හි ඇති චෙක්පත් error_reportingසහ display_errorsphp විධානයන් වෙනස් වී නොමැත
  • .Htaccess හි පරීක්ෂා කිරීම error_reportingසහ display_errorsphp විධානයන් වෙනස් වී නොමැත
  • .Htaccess හි ඔබට විධානයක් තිබේ නම්, .htconf ගොනුවේ ඒවාට තවමත් අවසර තිබේද යන්න පරීක්ෂා කරන්න
  • අවසාන වශයෙන් ඔබේ කේතය පරීක්ෂා කරන්න; සම්බන්ධයක් නැති පුස්තකාලයක් විය හැකිය; error_reportingසහ display_errorsphp විධානයන් එහි සකසා තිබේදැයි බැලීමට .


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 coalescing operator භාවිතා කළ හැකිය:

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(); }
කෝඩරයක්

ඔබේ කේතය සැබවින්ම නොසලකා හරින ලද දෝෂයකි: ?? - 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';
මෙය ඔබට මුහුණ දිය හැකි ඉතා සුලභ දෝෂයකි.ඉතින් කරදර නොවන්න විචල්‍යය ප්‍රකාශ කර කේතීකරණය භුක්ති විඳින්න .


9

මෙය සිදුවන්නේ ඇයි?

කාලයාගේ ඇවෑමෙන්, PHP වඩාත් ආරක්‍ෂිත කේන්ද්‍රීය භාෂාවක් බවට පත්ව ඇත. පෙරනිමියෙන් අක්‍රිය කිරීමට භාවිතා කළ සැකසුම් දැන් පෙරනිමියෙන් සක්‍රිය කර ඇත. මේ සඳහා කදිම නිදසුනක් නම් E_STRICT, එය පෙරනිමියෙන් PHP 5.4.0 ලෙස සක්‍රිය කර ඇත .

තවද, PHP ප්‍රලේඛනයට අනුව, පෙරනිමියෙන්, E_NOTICEphp.ini හි අක්‍රීය කර ඇත. නිදොස් කිරීමේ අරමුණු සඳහා එය සක්‍රිය කිරීමට PHP ලියකියවිලි නිර්දේශ කරයි . කෙසේ වෙතත්, මම උබුන්ටු ගබඩාවෙන් සහ බිට්නාමිගේ වින්ඩෝස් තොගයෙන් PHP බාගත කරන විට - මට වෙනත් දෙයක් පෙනේ.

; 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 =. CGI හෝ FPM භාවිතා කරන්නේ නම් Apache හෝ PHP නැවත ආරම්භ කරන්න. ඔබ "නිවැරදි" php.ini සංස්කරණය කරන බවට වග බලා ගන්න. නිවැරදි දෙය නම් ඔබ Apache සමඟ PHP ධාවනය කරන්නේ නම්, PHP-FPM ධාවනය කරන්නේ නම් fpm හෝ php-fpm, PHP-CGI ධාවනය කරන්නේ නම් cgi යනාදියයි. මෙය නිර්දේශිත ක්‍රමය නොවේ, නමුත් ඔබට උරුම කේතය තිබේ නම් සංස්කරණය කිරීම අතිශයින් දුෂ්කර වනු ඇත, එවිට එය ඔබගේ හොඳම ඔට්ටුව විය හැකිය.

  2. E_NOTICEගොනුව හෝ ෆෝල්ඩර මට්ටම අක්‍රිය කරන්න . ඔබට යම්කිසි උරුම කේතයක් ඇති නමුත් වෙනත් ආකාරයකින් “නිවැරදි” ආකාරයට දේවල් කිරීමට අවශ්‍ය නම් මෙය වඩාත් සුදුසු වේ. මෙය සිදු කිරීම සඳහා, ඔබ Apache2, Nginx හෝ ඔබේ අභිමත සේවාදායකය කුමක් හෝ විමසිය යුතුය. Apache හි, ඔබ php_valueඇතුළත භාවිතා කරනු ඇත <Directory>.

  3. පිරිසිදු වීමට ඔබේ කේතය නැවත ලියන්න. නිෂ්පාදන පරිසරයකට යන අතරතුර ඔබට මෙය කිරීමට අවශ්‍ය නම් හෝ ඔබේ දෝෂ කිසිවෙකු දැකීමට අකමැති නම්, ඔබ කිසියම් දෝෂයක් අක්‍රීය කර ඇති බවට වග බලා ගන්න, ඔබේ දෝෂ පමණක් සටහන් කරන්න (බලන්න display_errorsසහ log_errorsphp.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';

(අමතර ඉඟිය)

  • මට මෙම සහ වෙනත් ගැටළු වලට මුහුණ දෙන විට, මම නෙට්බීන්ස් IDE (නොමිලේ) භාවිතා කළ අතර එය මට අනතුරු ඇඟවීම් සහ දැන්වීම් රාශියක් ලබා දුන්නේය. ඒවායින් සමහරක් ඉතා ප්‍රයෝජනවත් ඉඟි ඉදිරිපත් කරයි. මෙය අවශ්‍යතාවයක් නොවන අතර විශාල ව්‍යාපෘති හැර මම තවදුරටත් IDE භාවිතා නොකරමි. මම vimමේ දිනවල වැඩි පුද්ගලයෙක් :).

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

?>

6

නිර්වචනය නොකළ දර්ශකය යනු නිදසුනක් ලෙස ලබා ගත නොහැකි අරාව දර්ශකය සඳහා ඔබ ඉල්ලූ අරාවකි

<?php 

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

?>

නිර්වචනය නොකළ විචල්‍යය යන්නෙන් අදහස් කරන්නේ ඔබ සම්පූර්ණයෙන්ම භාවිතා කර නැති විචල්‍යයක් භාවිතා කර ඇති බවයි

<?php print_r($myvar); ?>

නිර්වචනය නොකළ ඕෆ්සෙට් යන්නෙන් අදහස් කරන්නේ ඔබ නොපවතින යතුරක් ඉල්ලා ඇති බවයි. මේ සඳහා විසඳුම වන්නේ භාවිතයට පෙර පරීක්ෂා කිරීමයි

php> echo array_key_exists(1, $myarray);

4

ප්රශ්නයේ මෙම කොටස සම්බන්ධයෙන්:

ඔවුන් හදිසියේම පෙනෙන්නේ ඇයි? මම වසර ගණනාවක් මෙම ස්ක්‍රිප්ට් භාවිතා කළ අතර මට කිසි විටෙකත් කිසිදු ගැටළුවක් නොවීය.

නිශ්චිත පිළිතුරු නොමැත, නමුත් සැකසුම් 'හදිසියේ' වෙනස් කළ හැක්කේ මන්ද යන්න පිළිබඳ පැහැදිලි කිරීම් කිහිපයක් මෙහි දැක්වේ:

  1. ඔබ PHP නව අනුවාදයකට යාවත්කාලීන කර ඇති අතර එමඟින් දෝෂ_ වාර්තාකරණය, display_errors හෝ වෙනත් අදාළ සැකසුම් සඳහා වෙනත් පෙරනිමි තිබිය හැකිය.

  2. ක්‍රියාත්මක වන වේලාවට අදාළ සැකසුම් සකසන ini_set()හෝ error_reporting()(කේතයේ මේවා සොයන්න ) ඔබ යම් කේතයක් ඉවත් කර හෝ හඳුන්වා දී ඇත (සමහර විට යැපීමක ).

  3. ඔබ වෙබ් සේවාදායක වින්‍යාසය වෙනස් කර ඇත (මෙහි .htaccessඅපාචේ උපකල්පනය කරයි): ලිපිගොනු සහ වොස්ට් වින්‍යාසයන්ට php සැකසුම් හැසිරවිය හැක.

  4. සාමාන්‍යයෙන් දැන්වීම් ප්‍රදර්ශනය නොකෙරේ / වාර්තා නොවේ ( PHP අත්පොත බලන්න ) එබැවින් සේවාදායකය සැකසීමේදී php.ini ගොනුව කිසියම් හේතුවක් නිසා පූරණය කළ නොහැකි විය හැකිය (ගොනු අවසර ??) සහ ඔබ පෙරනිමි සැකසුම් වල සිටියේය . පසුකාලීනව, 'දෝෂය' විසඳා ඇත (අහම්බෙන්) දැන් එය නිවැරදි php.ini ගොනුව දෝෂ_ වාර්තාකරණ කට්ටලය සමඟ දැන්වීම් පෙන්වීමට පූරණය කළ හැකිය.


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

ත්‍රිකෝණයක් භාවිතා කිරීම සරල, කියවිය හැකි සහ පිරිසිදු ය:

පෙර PHP 7
වෙනත් විචල්‍යයක අගය සකසා ඇත්නම් එහි වටිනාකමට එය යොදන්න, එසේ නොමැතිනම්null(හෝඔබට අවශ්‍යඕනෑම පෙරනිමි අගයක්)පවරන්න:

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

PHP 7+ Null Coalescing Operator
භාවිතා කිරීම හැර සමාන වේ. මෙය ගොඩනඟා ඇති බැවින් තවදුරටත් ඇමතීමේ අවශ්‍යතාවයක් නොමැත, සහ පරීක්ෂා කර ඇති විචල්‍යයේ අගය ආපසු ලබා දීමට උපකල්පනය කර ඇති බැවින් ආපසු පැමිණීමට විචල්‍යය සැපයීමට අවශ්‍ය නොවේ: isset()

$newVariable = $thePotentialData ?? null;

දෙකම OP ප්‍රශ්නයෙන් දැන්වීම් නවත්වනු ඇත, සහ දෙකම හරියටම සමාන වේ:

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

 
ඔබට නව විචල්‍යයක් සැකසීමට අවශ්‍ය නොවන්නේ නම්, සමඟ 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 දැන්වීම් යටපත් කිරීමට හෝ අඩු කිරීමට හැකිය, නමුත් එය ගැටළුව නිරාකරණය නොකරයි , එය දෝෂ ලොගයේ වාර්තා වීම නවත්වයි. මෙයින් අදහස් කරන්නේ ඔබගේ කේතය තවමත් සකසා නොමැති විචල්‍යයක් භාවිතා කිරීමට උත්සාහ කර ඇති අතර එයින් අදහස් කරන්නේ යමක් අදහස් කළ පරිදි ක්‍රියා නොකරන බවයි - නැතිවූ අගය කෙතරම් තීරණාත්මකද යන්න මත පදනම්ව.

ඔබ සැබවින්ම මෙම ගැටලුව පරික්ෂා කර නිසි පරිදි හැසිරවිය යුතුය, එක්කෝ වෙනත් පණිවිඩයකට සේවය කිරීම හෝ අනෙක් සියල්ලටම නිරවද්‍ය තත්වය හඳුනා ගැනීම සඳහා ශුන්‍ය අගයක් ලබා දීම.

දැන්වීම දෝෂ සටහනේ නොතිබීම ගැන ඔබ සැලකිලිමත් වන්නේ නම්, විකල්පයක් ලෙස ඔබට දෝෂ ලොගය නොසලකා හැරිය හැකිය.


1

අප විසින් සකසා නොමැති විචල්‍යයක් භාවිතා කරන සෑම විටම මෙම දෝෂ සිදු වේ.

මේවා සමඟ කටයුතු කිරීමට ඇති හොඳම ක්‍රමය වන්නේ සංවර්ධනයේදී දෝෂ වාර්තා කිරීමයි.

දෝෂ වාර්තා කිරීම සැකසීමට:

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

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. පළමුව, අනතුරු ඇඟවීමට හේතුව එයදැයි ඔබට තහවුරු කළ හැකිද? දෙවනුව, එය ගැටලුව නම්, වටිනාකම මත පදනම්ව මට කොන්දේසියක් ලිවිය නොහැක්කේ ඇයි? මට කොන්දේසිය ලිවීමට අවශ්‍ය යතුර සමඟ එය තිබිය යුතුද?

යාවත්කාලීන කිරීම 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)){

-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";
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.