යොමුව - PHP හි මෙම දෝෂය අදහස් කරන්නේ කුමක්ද?


1148

මේ කුමක් ද?

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

ඇයි මේ?

"දැනටමත් යවා ඇති ශීර්ෂයන්" හෝ "වස්තුවක් නොවන සාමාජිකයෙකු ඇමතීම " වැනි ප්‍රශ්න නිතරම ගොඩගැසී ඇත. එම ප්‍රශ්නවලට මූලික හේතුව සැමවිටම එක හා සමානයි. එබැවින් එම ප්‍රශ්නවලට පිළිතුරු සාමාන්‍යයෙන් ඒවා පුනරාවර්තනය කර ඒවායේ විශේෂිත අවස්ථාවෙහිදී වෙනස් විය යුතු රේඛාව පෙන්වයි. මෙම පිළිතුරු වෙබ් අඩවියට කිසිදු වටිනාකමක් එක් නොකරන්නේ ඒවා OP හි විශේෂිත කේතයට පමණක් අදාළ වන බැවිනි. එකම දෝෂයක් ඇති අනෙක් පරිශීලකයින්ට එය දේශීයකරණය වී ඇති බැවින් එයින් විසඳුම පහසුවෙන් කියවිය නොහැක. එය කණගාටුවට කරුණකි, මන්ද ඔබ මූලික හේතුව තේරුම් ගත් පසු, දෝෂය නිවැරදි කිරීම ඉතා සුළුය. එබැවින්, මෙම ලැයිස්තුව විසඳුම පොදු ආකාරයකින් පැහැදිලි කිරීමට උත්සාහ කරයි.

මා මෙහි කුමක් කළ යුතුද?

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

ඔබට දායක වීමට අවශ්‍ය නම්, කරුණාකර ඔබේ "ප්‍රියතම" දෝෂ පණිවිඩය, අනතුරු ඇඟවීම හෝ දැනුම්දීම, පිළිතුරකට එකක්, එහි අර්ථය කුමක්ද යන්න පිළිබඳ කෙටි විස්තරයක් (එය ඔවුන්ගේ අත්පොතට පමණක් පද ඉස්මතු කළත්), හැකි විසඳුමක් හෝ නිදොස් කිරීමේ ප්‍රවේශයක් සහ වටිනාකමක් ඇති පවත්නා ප්‍රශ්න හා පිළිතුරු ලැයිස්තුවක්. එසේම, පවතින පිළිතුරු වැඩි දියුණු කිරීමට නිදහස් වන්න.

ලැයිස්තුව

එසේම, බලන්න:


7
එසේම, අදහස් දැක්වීමෙන් සාකච්ඡාව ගෙනයාමට කරුණාකර මෙම මෙටා ප්‍රශ්නයට යන්න
අර්ල්ස්



Answers:


278

අවවාදයයි: ශීර්ෂ තොරතුරු වෙනස් කළ නොහැක - ශීර්ෂයන් දැනටමත් යවා ඇත

ඔබේ ස්ක්‍රිප්ට් මඟින් සේවාදායකයාට HTTP ශීර්ෂයක් යැවීමට උත්සාහ කරන විට සිදු වේ, නමුත් මීට පෙර ප්‍රතිදානයක් තිබුනි, එහි ප්‍රති head ලයක් ලෙස ශීර්ෂයන් දැනටමත් සේවාදායකයා වෙත යවනු ලැබේ.

මේ වනාහි E_WARNING අකුරු වන අතර එය පිටපත නවත්වන්නේ නැත.

සාමාන්‍ය උදාහරණයක් වනුයේ මෙවැනි අච්චු ගොනුවක් වනු ඇත:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

මෙම session_start()කාර්යය ගනුදෙනුකරුගේ සැසි කුකිය සමග ශීර්ෂ යැවීමට උත්සාහ කරනු ඇත. නමුත් <html>ප්‍රතිදාන ප්‍රවාහයට මූලද්‍රව්‍යය ලියන විට PHP දැනටමත් ශීර්ෂයන් යවා ඇත. ඔබට session_start()ඉහළට ගෙන යා යුතුයි.

අනතුරු ඇඟවීම අවුලුවන කේතයට පෙර ඇති රේඛා ඔස්සේ ගොස් ඔබට එය විසඳිය හැක්කේ කොතැනින්දැයි සොයා බලන්න. ඕනෑම ශීර්ෂයක් යවන කේතයක් එම කේතයට පෙර ගෙන යන්න.

බොහෝ විට නොසලකා හරින ලද ප්‍රතිදානය PHP වසා දැමීමෙන් පසු නව රේඛා ?>වේ. එය ?>ගොනුවේ අවසාන දෙය වන විට මඟ හැරීම සම්මත භාවිතයක් ලෙස සැලකේ . ඒ හා සමානව, මෙම අනතුරු ඇඟවීම සඳහා තවත් පොදු හේතුවක් වන්නේ විවෘත කිරීමට <?phpපෙර හිස් ඉඩක්, රේඛාවක් හෝ අදෘශ්‍යමාන චරිතයක් තිබීමයි, එමඟින් වෙබ් සේවාදායකය විසින් ශීර්ෂයන් සහ හිස් අවකාශය / නව රේඛාව යැවීමට හේතු වන අතර PHP විග්‍රහ කිරීම ආරම්භ කරන විට ඉදිරිපත් කිරීමට නොහැකි වනු ඇත. ඕනෑම ශීර්ෂයක්.

ඔබේ ගොනුවේ <?php ... ?>කේත වාරණයකට වඩා තිබේ නම්, ඔබට ඒවා අතර කිසිදු ඉඩක් නොතිබිය යුතුය. (සටහන: ඔබට ස්වයංක්‍රීයව සාදන ලද කේතයක් තිබේ නම් ඔබට බහු වාරණ තිබිය හැක)

ඔබේ කේතයේ කිසිදු බයිට් ඇණවුම් ලකුණු නොමැති බවට වග බලා ගන්න, උදාහරණයක් ලෙස ස්ක්‍රිප්ට් කේතනය කිරීම BOM සමඟ UTF-8 වන විට.

අදාළ ප්‍රශ්න:


2
ඔබ වර්ඩ්ප්‍රෙස් භාවිතා කරන්නේ නම්, තේමා ගොනු පරීක්ෂා කරන්න. මම වෙබ් අඩවියක් වර්ඩ්ප්‍රෙස් හි නව අනුවාදයකට යාවත්කාලීන කළ විට, තේමාව යාවත්කාලීන කිරීමට මට නොහැකි වූයේ එය වසර කිහිපයකින් යාවත්කාලීන නොවූ බැවිනි. මෙම ගැටළුව උත්සන්න විය. Function.php ගොනුවට එකකට වඩා ඇති බව පෙනී ගියේය <? ?> අතර ඇති අවකාශයන් සමඟ අවහිර කරන්න.
රෝයි ලෙබන්

2
OyRoyLeban "ඔබේ ගොනුවේ එක් වාරයකට වඩා තිබේ නම් ..." මෙහි තේරුම කුමක්දැයි මට විශ්වාස නැත. "බ්ලොක්" යනු කුමක්ද? එක් බ්ලොක් එකකින් සමන්විත වන <?php ?>අතර “එකකට වඩා වැඩි ගණනක්” වනු <?php ?> <?php ?>ඇත්ද?
ඇන්ඩ rew ෆොක්ස්

2
කරුණාකර හැකි නම් PHP.ini වින්‍යාස ගොනුවේ 'ප්‍රතිදාන බෆරින්' විශේෂාංගය සක්‍රිය කරන්න. මෙය මෙම ගැටළුව මඟහරවා ගැනීම සඳහා භාවිතා කරයි. ශීර්ෂයන් වෙනත් ස්ථානයක නිකුත් කරනු ලැබේ, පසුව පැරණි ශීර්ෂකය නව ශීර්ෂකය ප්‍රතිස්ථාපනය වේ.
නිධින් ඩේවිඩ්

192

මාරක දෝෂය: සාමාජික ශ්‍රිතයකට අමතන්න ... වස්තුවක් නොවන

වස්තුවක් නොමැති xyz->method()තැනට සමාන කේතයක් සමඟ සිදු වේxyzmethod හැඳින්විය නොහැක.

මෙය මාරාන්තික දෝෂයක් වන අතර එය ස්ක්‍රිප්ට් එක නවත්වනු ඇත (ඉදිරි අනුකූලතා දැන්වීම: එය PHP 7 සමඟ ආරම්භ කළ හැකි දෝෂයක් බවට පත්වේ).

බොහෝ විට මෙය කේතයේ දෝෂ තත්වයන් සඳහා චෙක්පත් නොමැති බවට ලකුණකි. වස්තුවක් එහි ක්‍රම ඇමතීමට පෙර ඇත්ත වශයෙන්ම වස්තුවක් බව තහවුරු කරන්න.

සාමාන්ය උදාහරණ ලෙස ගත හැක

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

ඉහත උදාහරණයේ දී, විමසුම සකස් කළ නොහැකි අතර prepare()එය පවරනු falseලැබේ $statement. execute()ක්‍රමවේදය ඇමතීමට උත්සාහ කිරීමෙන් මාරාන්තික දෝෂයක් ඇති වේfalse එය “වස්තුවක් නොවන” නිසා අගය බූලියන් වේ.

ඔබේ ශ්‍රිතය වස්තුවක් වෙනුවට බූලියන් ලබා දුන්නේ මන්දැයි සොයා බලන්න . උදාහරණයක් ලෙස, පරීක්ෂා කරන්න$pdo අවසන් වරට සිදු වූ දෝෂය සඳහා වස්තුව . මෙය නිදොස්කරණය කරන්නේ කෙසේද යන්න පිළිබඳ විස්තර රඳා පවතින්නේ අදාළ ශ්‍රිතය / වස්තුව / පන්තිය සඳහා දෝෂ හසුරුවන ආකාරය මත ය.

එය පවා ->prepareඅසමත් වුවහොත් ඔබේ $pdoදත්ත සමුදා හැසිරවීමේ වස්තුව වත්මන් විෂය පථයට නොපැමිණියේය . එය අර්ථ දක්වා ඇති ස්ථානය සොයා ගන්න. ඉන්පසු එය පරාමිතියක් ලෙස සම්මත කරන්න, එය දේපලක් ලෙස ගබඩා කරන්න, නැතහොත් ගෝලීය විෂය පථය හරහා බෙදා ගන්න.

තවත් ගැටළුවක් වන්නේ කොන්දේසි සහිතව වස්තුවක් නිර්මාණය කර එම කොන්දේසි සහිත කොටසින් පිටත ක්‍රමයක් ඇමතීමට උත්සාහ කිරීමයි. උදාහරණයක් වශයෙන්

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

කොන්දේසි සහිත කොටසින් පිටත ක්රමය ක්රියාත්මක කිරීමට උත්සාහ කිරීමෙන්, ඔබේ වස්තුව අර්ථ දැක්විය නොහැක.

අදාළ ප්‍රශ්න:


116

කිසිවක් නොපෙනේ. පිටුව හිස් හා සුදු ය.

මරණයේ සුදු පිටුව හෝ මරණයේ සුදු තිරය ලෙසද හැඳින්වේ . දෝෂ වාර්තා කිරීම අක්‍රිය කර මාරාන්තික දෝෂයක් (බොහෝ විට සින්ටැක්ස් දෝෂයක්) සිදු වූ විට මෙය සිදු වේ.

ඔබට දෝෂ ලොග් වීම සක්‍රීය කර ඇත්නම්, ඔබගේ දෝෂ ලොගයේ කොන්ක්‍රීට් දෝෂ පණිවිඩය ඔබ සොයා ගනු ඇත. මෙය සාමාන්‍යයෙන් "php_errors.log" නම් ගොනුවක කේන්ද්‍රීය ස්ථානයක (උදා/var/log/apache2 බොහෝ ලිනක්ස් පරිසරවල) හෝ ස්ක්‍රිප්ටයේ නාමාවලියෙහි (සමහර විට හවුල් සත්කාරක පරිසරයක භාවිතා වේ).

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

ස්ක්‍රිප්ටයේ ඉහළින් පහත දැක්වෙන PHP කේතය එක් කිරීමෙන් මෙය පහසුවෙන් කළ හැකිය:

ini_set('display_errors', 1); error_reporting(~0);

කේතය දෝෂ පෙන්වීම සක්‍රිය කර වාර්තාකරණය ඉහළම මට්ටමට සකසනු ඇත.

සිට ini_set()ක්රියාත්මක වීමේදී එහි ක්රියාත්මක වන එය අන්තහ්කරණය / කාරක රීති වැරදි මත කිසිදු බලපෑම් ඇති කරයි. එම දෝෂ ලොගයේ දිස්වනු ඇත. ඔබට ඒවා ප්‍රතිදානයේ ද පෙන්වීමට අවශ්‍ය නම් (උදා: බ්‍රව්සරයක) ඔබට display_startup_errorsනියෝගය සැකසිය යුතුය true. තුළ එක්කෝ මේක කරන්න php.iniහෝ දී .htaccessහෝ , මානකරන බලපාන වෙනත් ඕනෑම ක්රමයක් පෙර ධාවන .

ඔබ ස්ථාපනය කිරීම සඳහා එම ක්රම භාවිතා කළ හැකිය log_errors හා error_log ඔබේ ම ලඝු-සටහන ගොනු ස්ථානය තෝරා ගැනීම සඳහා උපදෙස්.

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

අදාළ ප්‍රශ්න:

අදාළ දෝෂ:


3
error_reporting(~0);ඇයි නැත්තේ -1? එය ~0තක්සේරු කරන්නේ හා ගුප්ත ගුණයකින් අඩු ය.
Fabrício Matté

3
මම හිතන්නේ දෙකම ඒ හා සමාන ගුප්ත ය. ~0වඩාත් පැහැදිලි IMO වේ: හිස් බිට් කට්ටලය ප්‍රතික්ෂේප කරන්න, එනම් සියලු ධජ සක්‍රීය කරන්න . -1 යනු C හි strpos () හි මෙන් «සොයාගත නොහැකි for යන්නෙන් අදහස් නොකෙරේ, නමුත් සියලු ධජයන් සහිත බිට්සෙට් එකක් ලෙස -1, ද්විමය 1111'1111'1111'1111(බිටු 32 සඳහා).
nalply

2
අපොයි, 1111'1111'1111'1111ඇත්ත වශයෙන්ම බිටු 16 ක්, නමුත් මම අදහස් කරන දේ ඔබ තේරුම් ගනී යැයි මම බලාපොරොත්තු වෙමි.
nalply

105

දැන්වීම: නිර්වචනය නොකළ දර්ශකය

අරාවෙහි නොපවතින යතුරක් මඟින් ඔබ අරාවකට ප්‍රවේශ වීමට උත්සාහ කරන විට සිදු වේ.

Undefined Indexදැන්වීමක සාමාන්‍ය උදාහරණයක් වනුයේ ( නිරූපණය )

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

දෙකම spinachසහ 1අරාවෙහි නොපවතින අතර, එය E_NOTICEඅවුලුවන.

විසඳුම වන්නේ එම දර්ශකයට ප්‍රවේශ වීමට පෙර දර්ශකය හෝ ඕෆ්සෙට් පවතින බවට වග බලා ගැනීමයි. මෙයින් අදහස් කරන්නේ ඔබ අපේක්‍ෂා කරන විට එම දර්ශක පවතින බව සහතික කිරීම සඳහා ඔබේ වැඩසටහනේ දෝෂයක් නිවැරදි කළ යුතු බවයි. හෝ එය භාවිතා කරමින් දර්ශක පවතී ද යන්න ඔබ පරීක්ෂා කිරීමට අවශ්ය බව ඉන් අදහස් විය හැක array_key_existsහෝ isset:

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in the array';
}

ඔබට පහත කේත තිබේ නම්:

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

පසුව $_POST['message']මෙම පිටුව පළමු පැටවීමේදී සකස් කළ නොහැකි වනු ඇත ඔබ ඉහත දෝෂය ලැබෙනු ඇත. ආකෘති පත්‍රය ඉදිරිපත් කර දෙවන වරටත් මෙම කේතය ක්‍රියාත්මක කළ විට පමණක් අරාව දර්ශකය පවතිනු ඇත. ඔබ සාමාන්‍යයෙන් මේ සඳහා පරීක්ෂා කරන්නේ:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

අදාළ ප්‍රශ්න:


මම භාවිතා කිරීමට නැඹුරු වෙමිif(!empty($_POST['message'])){ //do stuff }
kurdtpage

87

අවවාදයයි: mysql_fetch_array () 1 පරාමිතිය සම්පතක් වනු ඇතැයි අපේක්ෂා කරයි, බූලියන් ලබා දී ඇත

පළමු හා ප්රධාන වශයෙන්:

කරුණාකර, mysql_*නව කේත වල කාර්යයන් භාවිතා නොකරන්න . ඒවා තවදුරටත් නඩත්තු නොකරන අතර නිල වශයෙන් අතහැර දමනු ලැබේ. රතු පෙට්ටිය බලන්න? ඒ වෙනුවට සූදානම් කළ ප්‍රකාශ ගැන ඉගෙන ගෙන PDO හෝ MySQLi භාවිතා කරන්න- මෙම ලිපිය ඔබට තීරණය කිරීමට උපකාරී වේ. ඔබ PDO තෝරා ගන්නේ නම්, මෙන්න හොඳ නිබන්ධනයක් .


ප්‍රති result ලයෙන් දත්ත ලබා ගැනීමට ඔබ උත්සාහ කරන විට මෙය සිදු වේ mysql_query නමුත් විමසුම අසාර්ථක විය.

මෙය අනතුරු ඇඟවීමක් වන අතර ස්ක්‍රිප්ට් එක නවත්වන්නේ නැත, නමුත් ඔබේ වැඩසටහන වැරදි කරයි.

ඔබ විසින් ලබා දෙන නිසා, පරීක්ෂා කිරීමට අවශ්ය mysql_queryවිසින්

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

අදාළ ප්‍රශ්න:

අදාළ දෝෂ:

mysql*MySQL ප්‍රති result ල සම්පතක් පරාමිතියක් ලෙස අපේක්ෂා කරන වෙනත් කාර්යයන් එකම හේතුව නිසා එකම දෝෂයක් ඇති කරයි.


5
සටහනක් පමණි. mysql_queryඑතරම් නරක නොවේ නම් or die, එය මත එකතු කිරීම තුවාලයට අපහාසයක් එක් කරයි.
මදාරාගේ අවතාරය

$res = mysql_query($query)විමසුම සාර්ථක නම් එය සත්‍යයක් ලෙස සලකන්නේ නම් මට ඇති ගැටළුව 1 වේ. එම නිසා ප්‍රති result ල දැන්වීම mysql_query වෙත mysql_fetch_array()යොමු කිරීමේදී පෙන්වයි.
mboy

@mboy තෝරාගැනීම, පෙන්වීම, විස්තර කිරීම, පැහැදිලි කිරීම සහ ප්‍රති statement ල ලබා දෙන වෙනත් ප්‍රකාශ සඳහා, mysql_query () සාර්ථකත්වය සඳහා සම්පතක් ලබා දෙයි, නැතහොත් වැරදියට වැරදියට වැටේ. වෙනත් ආකාරයේ SQL ප්‍රකාශ සඳහා, INSERT, UPDATE, DELETE, DROP යනාදිය සඳහා, mysql_query () සාර්ථකත්වය මත සත්‍යය හෝ වැරදියට FALSE ලබා දෙයි.
xdazz

@xdazz මා මුහුණ දෙන ගැටලුව එයයි, ඇතුළත් කිරීම යාවත්කාලීනය සත්‍ය වන බැවින් මට මෙම දෝෂයෙන් මිදීමට නොහැකි බව mysql_fetch_array() expects parameter 1 to be resource, boolean given in select කරුණාකර බලන්න - gist.github.com/romelemperado/93af4cdbd44ebf3a07cbfa0e3fc539d7 මෙම දෝෂයෙන් මිදීමට කිසියම් යෝජනාවක් තිබේද?
mboy

2
bomboy mysql_fetch_array()යනු තෝරාගත් විමසුමක් සඳහා, ඇතුළු කිරීම සහ යාවත්කාලීන කිරීම සඳහා, ඔබට ප්‍රති set ල කට්ටලය ලබා ගැනීමට අවශ්‍ය නොවේ (තවද ඔබට ලබා ගැනීමට ඉඩ දෙන ප්‍රති result ල කට්ටලයක් නොමැත).
xdazz

81

මාරක දෝෂය: වස්තු සන්දර්භය තුළ නොමැති විට using භාවිතා කිරීම

$thisපැවරිය නොහැකි PHP හි විශේෂ විචල්‍යයකි . එය නොපවතින සන්දර්භයකට ප්‍රවේශ වුවහොත් මෙම මාරක දෝෂය ලබා දෙනු ලැබේ.

මෙම දෝෂය ඇතිවිය හැකිය:

  1. ස්ථිතික නොවන ක්‍රමයක් ස්ථිතික ලෙස හැඳින්වුවහොත්. උදාහරණයක්:

    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();

    නිවැරදි කරන්නේ කෙසේද: ඔබේ කේතය නැවත සමාලෝචනය කරන්න,$thisභාවිතා කළ හැක්කේ වස්තු සන්දර්භයක් තුළ පමණක් වන අතර එය කිසි විටෙකත් ස්ථිතික ක්‍රමයකට භාවිතා නොකළ යුතුය. එසේම, ස්ථිතික ක්‍රමයක් මගින් ස්ථිතික නොවන දේපල වෙත ප්‍රවේශ නොවිය යුතුය. self::$static_propertyස්ථිතික දේපල වෙත ප්‍රවේශ වීමටභාවිතා කරන්න.

  2. පන්ති ක්රමය සිට කේතය සාමාන්ය කාර්යය හෝ යන්තම් ගෝලීය විෂය පථය තුලට පිටපත් කර තිබේ නම්, හා රඳවා තබා ගනිමින් $thisවිශේෂ විචල්ය.
    නිවැරදි කරන්නේ කෙසේද: කේතය සමාලෝචනය $thisකර වෙනත් ආදේශන විචල්‍යයකින් ආදේශ කරන්න.

අදාළ ප්‍රශ්න:

  1. ස්ථිතික නොවන ක්‍රමය ස්ථිතික ලෙස අමතන්න: PHP මාරක දෝෂය: වස්තු සන්දර්භය තුළ නොමැති විට using භාවිතා කිරීම
  2. කේතය හරහා පිටපත් කරන්න: මාරක දෝෂය: වස්තු සන්දර්භය තුළ නොමැති විට $ මෙය භාවිතා කිරීම
  3. සියලුම "වස්තු සන්දර්භය තුළ නොමැති විට මෙය භාවිතා කිරීම" ස්ටැකෝවර් ප්‍රවාහ පිළිබඳ ප්‍රශ්න

2
මෙය වසා දැමීම් / වසා දැමීම් (ස්ථිතික නොවන ක්‍රම වලදී පවා) සහ 5.4 හි “ස්ථාවර” වන්නේ කෙසේද යන්න සඳහන් කිරීමට ඔබට අවශ්‍ය විය හැකිය.
කෙන්ඩල් හොප්කින්ස්

2
khakre මම කතා කරමින් සිටියේ වසා දැමීමක් තුළ ස්ථිතික ඇමතුමක් ගැන ය. වගේ $closure = function() { self::method(); }.
කෙන්ඩල් හොප්කින්ස්

2
End කෙන්ඩල් හොප්කින්ස්: එය වෙනස් දෝෂයකි: "මාරක දෝෂය: ස්වයං ප්‍රවේශයට පිවිසිය නොහැක :: පන්ති විෂය පථයක් සක්‍රිය නොවන විට" කෙසේ වෙතත් $thisඔබ සමඟ "මාරක දෝෂය: වස්තු සන්දර්භය තුළ නොමැති විට මෙය භාවිතා කිරීම" අවුලුවාලිය හැකිය :$closure = function() { $this->method(); };
හක්රේ

77

මාරාන්තික දෝෂය: නිර්වචනය නොකළ ශ්‍රිතයට අමතන්න XXX

ඔබ තවම අර්ථ දක්වා නොමැති ශ්‍රිතයක් ඇමතීමට උත්සාහ කරන විට සිදු වේ. පොදු හේතු අතරට අස්ථානගත වූ දිගු ඇතුළත් වන අතර, කොන්දේසි සහිත ශ්‍රිත ප්‍රකාශනය, ශ්‍රිත ප්‍රකාශයක ක්‍රියාකාරිත්වය හෝ සරල යතුරු ලියනය ඇතුළත් වේ.

උදාහරණ 1 - කොන්දේසි සහිත ක්‍රියාකාරී ප්‍රකාශනය

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

මෙම අවස්ථාවේ දී, සත්‍ය නොවන fn()නිසා කිසි විටෙකත් ප්‍රකාශයට පත් $someConditionනොකෙරේ.

උදාහරණ 2 - ක්‍රියාකාරී ප්‍රකාශනයේ ක්‍රියාකාරිත්වය

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

මෙම අවස්ථාවේදී, fnප්රකාශයට පත් කරනු ලබන්නේ එක් වරක් පමණිcreateFn() ලබන්නේ ඇමතුමක් ලැබීමෙන් . පසුව ඇමතුම් ලබා ගන්නා බව සලකන්නcreateFn() සඳහා පවතින ශ්‍රිතයක් නැවත ප්‍රකාශ කිරීම පිළිබඳ දෝෂයක් ඇති වන බව සලකන්න.

ඔබට මෙය PHP සාදන ලද ශ්‍රිතයක් සඳහා ද දැකිය හැකිය. නිල අත්පොතේ කාර්යය සෙවීමට උත්සාහ කරන්න , එය අයත් වන්නේ කුමන “දිගුව” (PHP මොඩියුලය) සහ PHP හි කුමන අනුවාදයන් එයට සහය දක්වයිද යන්න පරීක්ෂා කරන්න.

දිගුවක් අස්ථානගත වී ඇත්නම්, එම දිගුව ස්ථාපනය කර එය php.ini හි සක්‍රීය කරන්න. ඔබේ ක්‍රියාකාරිත්වය දිස්වන දිගුව සඳහා PHP අත්පොතේ ඇති ස්ථාපන උපදෙස් වෙත යොමු වන්න. ඔබේ පැකේජ කළමණාකරු භාවිතයෙන් දිගුව සක්‍රිය කිරීමට හෝ ස්ථාපනය කිරීමට ඔබට හැකිය (උදා: aptඩේබියන් හෝ උබුන්ටු,yum Red Hat හෝ CentOS වලින්) හෝ පාලක පැනලය හවුල් සත්කාරක පරිසරයක.

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

ඇතුළත් නොවූ විට, ශ්‍රිතය ඇමතීමට පෙර ශ්‍රිතය ප්‍රකාශ කරන ගොනුව ඇතුළත් කිරීමට වග බලා ගන්න.

යතුරු ලියනයක දී, යතුරු ලියනය නිවැරදි කරන්න.

අදාළ ප්‍රශ්න:


73

විග්‍රහ කිරීමේ දෝෂය: සින්ටැක්ස් දෝෂය, අනපේක්ෂිත T_XXX

ඔබට අනපේක්ෂිත ස්ථානයක T_XXXටෝකනය , අසමතුලිත (අතිරික්ත) වරහන්, php.ini හි සක්‍රිය නොකර කෙටි ටැගය භාවිතා කිරීම සහ තවත් බොහෝ දේ සිදු වේ.

අදාළ ප්‍රශ්න:

වැඩිදුර සහාය සඳහා බලන්න:

  • http://phpcodechecker.com/ - එය ඔබේ වාක්‍ය ඛණ්ඩ පිළිබඳ තවත් ප්‍රයෝජනවත් පැහැදිලි කිරීම් සපයයි.

71

මාරක දෝෂය: ලිඛිත සන්දර්භය තුළ ශ්‍රිත ප්‍රතිලාභ අගය භාවිතා කළ නොහැක

මෙය සාමාන්‍යයෙන් සිදුවන්නේ සෘජුවම ශ්‍රිතයක් භාවිතා කරන විටය empty.

උදාහරණයක්:

if (empty(is_null(null))) {
  echo 'empty';
}

මෙයට හේතුව emptyභාෂා නිර්මාණයක් මිස ශ්‍රිතයක් නොවන බැවින් එය 5.5 ට පෙර PHP අනුවාදවල එහි තර්කය ලෙස ප්‍රකාශනයක් ලෙස හැඳින්විය නොහැක. PHP 5.5 ට පෙර, තර්කය විචල්‍යempty() විය යුතු නමුත් අත්තනෝමතික ප්‍රකාශනයක් (ශ්‍රිතයක ප්‍රතිලාභ අගය වැනි) PHP 5.5+ හි අවසර ඇත.

empty, එහි නම තිබියදීත්, විචල්‍යයක් "හිස්" දැයි සත්‍ය වශයෙන්ම පරීක්ෂා නොකරයි. ඒ වෙනුවට, එය විචල්‍යයක් නොපවතී දැයි පරීක්ෂා කරයි == false. ප්‍රකාශන (වැනිis_null(null) උදාහරණයේ දී ) සැමවිටම පවතින බව සලකනු ලැබේ, එබැවින් මෙහි emptyපරික්ෂා කරන්නේ එය අසත්‍යයට සමාන ද යන්න පමණි. ඔබට empty()මෙහි ප්‍රතිස්ථාපනය කළ හැකිය !, උදා if (!is_null(null)), හෝ පැහැදිලිවම අසත්‍යය සමඟ සැසඳිය හැකිය, උදා if (is_null(null) == false).

අදාළ ප්‍රශ්න:


64

MySQL: ඔබේ SQL වාක්‍ය ඛණ්ඩයේ දෝෂයක් තිබේ; නිවැරදි වාක්‍ය ඛණ්ඩය අසල ... පේළියේ ... භාවිතා කිරීම සඳහා ඔබේ MySQL සේවාදායක අනුවාදයට අනුරූප වන අත්පොත පරීක්ෂා කරන්න.

මෙම දෝෂය බොහෝ විට සිදුවන්නේ ඔබට MySQL විමසුමකට ලබා දුන් දත්ත නිසි ලෙස ගැලවීමට අමතක වූ බැවිනි.

නොකළ යුතු දේ පිළිබඳ උදාහරණයක් ("නරක අදහස"):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

Http://example.com/edit.php?id=10 වැනි URL එකක් සමඟ ඉදිරිපත් කිරීමට පෝරමයක් සහිත පිටුවකට මෙම කේතය ඇතුළත් කළ හැකිය. (n ° 10 ලිපිය සංස්කරණය කිරීමට)

ඉදිරිපත් කළ පා text යේ තනි උපුටා දැක්වීම් තිබේ නම් කුමක් සිදුවේද? $queryඅවසන් වන්නේ:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

මෙම විමසුම MySQL වෙත යවන විට, වාක්‍ය ඛණ්ඩය වැරදියි කියා පැමිණිලි කරනු ඇත, මන්ද මැද අමතර තනි උපුටා දැක්වීමක් ඇත.

එවැනි දෝෂ මඟහරවා ගැනීම සඳහා, විමසුමක භාවිතා කිරීමට පෙර ඔබ සැමවිටම දත්ත වලින් ගැලවිය යුතුය .

SQL විමසුමක භාවිතා කිරීමට පෙර දත්ත මග හැරීම ද ඉතා වැදගත් වේ, මන්ද එසේ නොකළහොත් ඔබේ ස්ක්‍රිප්ට් SQL එන්නත් සඳහා විවෘත වනු ඇත. SQL එන්නතක් මඟින් වාර්තාවක්, වගුවක් හෝ සම්පූර්ණ දත්ත ගබඩාවක් වෙනස් කිරීම, නැතිවීම හෝ වෙනස් කිරීම සිදුවිය හැකිය. මෙය ඉතා බරපතල ආරක්ෂක ගැටළුවක්!

ප්‍රලේඛනය:


3
ඊට අමතරව, ඔබ එසේ නොකළහොත් ඔබේ වෙබ් අඩවිය බොට්ස් මගින් ස්වයංක්‍රීයව හැක් කරනු ලැබේ
apscience

2
lagladoscc "සංස්කරණය කරන්න" ක්ලික් කර පිළිතුර වෙනස් කරන්න. එය වැඩිදියුණු කළ හැකි බව මම දනිමි.
ජොසලින්

2
නැතහොත් සකස් කළ වර්ග විමසුමක් භාවිතා කරන්න.
මාටෙජ්

54

විග්‍රහ කිරීමේ දෝෂය: සින්ටැක්ස් දෝෂය, අනපේක්ෂිත T_ENCAPSED_AND_WHITESPACE

සමස්ත සංකීර්ණ විචල්‍ය ව්‍යුහය තුළට ඇතුල් නොවූ විට ද්විත්ව උපුටා ගත් නූලක් තුළ අන්තර් මැදිහත්වීම සඳහා උපුටා ගත් යතුරක් සමඟ අරාව අගයක් යොමු කිරීමට උත්සාහ කිරීමේදී මෙම දෝෂය බොහෝ විට හමු වේ {}.

දෝෂ නඩුව:

මෙහි ප්‍රති result ලය වනු ඇත්තේ Unexpected T_ENCAPSED_AND_WHITESPACE:

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

හැකි විසඳුම්:

ද්විත්ව උපුටා string PHP හි භාවිතා කිරීමට මාලාවක් ප්රධාන නූල් අවසර ඇත ලැයිස්තුගත ෙනොකළ , හා නිකුත් නැහැ E_NOTICE. එබැවින් ඉහත සඳහන් දේ මෙසේ ලිවිය හැකිය.

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

සම්පූර්ණ සංකීර්ණ අරාව විචල්‍යය සහ යතුර (ය) ඇතුළත් කළ හැකි අතර {}, ඒවා වළක්වා ගැනීම සඳහා ඒවා උපුටා දැක්විය යුතුය E_NOTICE. සංකීර්ණ විචල්‍යයන් සඳහා PHP ප්‍රලේඛනය මෙම සින්ටැක්ස් නිර්දේශ කරයි.

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

ඇත්ත වශයෙන්ම, ඉහත සඳහන් ඕනෑම දෙයකට විකල්පය වන්නේ අරාව විචල්‍යය අන්තර්සම්බන්ධනය කිරීම වෙනුවට සංයුක්ත කිරීමයි:

echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

ප්රයෝජනය සඳහා, පිළිබඳ කොටස බලන්න විචල්ය අන්තහ්කරණය දී , PHP නූල් අත්පොත පිටුව


53

මාරක දෝෂය: XXX බයිට් වල මතක ප්‍රමාණය අවසන් වී ඇත (XXX බයිට් වෙන් කිරීමට උත්සාහ කර ඇත)

ඔබගේ ස්ක්‍රිප්ට් ධාවනය කිරීමට ප්‍රමාණවත් මතකයක් නොමැත. PHP මතක සීමාවට ළඟා වී ඇති අතර එය ක්‍රියාත්මක කිරීම නවත්වයි. මෙම දෝෂය මාරාන්තිකයි, පිටපත නතර වේ. මතක සීමාවේ අගය php.iniගොනුව තුළ හෝ ini_set('memory_limit', '128 M');ස්ක්‍රිප්ටයේ භාවිතා කිරීමෙන් වින්‍යාසගත කළ හැකිය (එමඟින් අර්ථ දක්වා ඇති අගය නැවත ලියනු ලැබේphp.ini ). මතක සීමාවේ පරමාර්ථය වන්නේ එක් PHP ස්ක්‍රිප්ටයක් පවතින සියලුම මතකය අවහිර කිරීමෙන් සහ මුළු වෙබ් සේවාදායකයම පහතට ගෙන ඒමයි.

කළ යුතු පළමු දෙය නම් ඔබේ ස්ක්‍රිප්ටයට අවශ්‍ය මතක ප්‍රමාණය අවම කිරීමයි. නිදසුනක් ලෙස, ඔබ විශාල ගොනුවක් විචල්‍යයකට කියවන්නේ නම් හෝ දත්ත සමුදායකින් බොහෝ වාර්තා ලබා ගන්නේ නම් සහ ඒවා සියල්ලම අරාවෙහි ගබඩා කරන්නේ නම්, එමඟින් විශාල මතකයක් භාවිතා කළ හැකිය. ගොනු කේතය පේළියෙන් කියවීමට හෝ දත්ත ගබඩාවේ වාර්තා එකවර මතකයේ තබා නොගෙන ඔබේ කේතය වෙනස් කරන්න. මේ සඳහා තිරය පිටුපස සිදුවන්නේ කුමක්ද සහ වෙනත් තැනක මතකයේ දත්ත ගබඩා කර ඇති විට සංකල්පීය දැනුමක් අවශ්‍ය වේ.

ඔබගේ ස්ක්‍රිප්ට් මතක ශක්තියෙන් ක්‍රියා නොකරන විට මෙම දෝෂය සිදුවී ඇත්නම්, මතක කාන්දුවක් තිබේදැයි බැලීමට ඔබේ කේතය පරීක්ෂා කළ යුතුය. මෙම memory_get_usageකාර්යය ඔබේ යාළුවා.

අදාළ ප්‍රශ්න:


46

අවවාදයයි: [ශ්‍රිතය] : ධාරාව විවෘත කිරීමට අසමත් විය:[හේතුව]

ඔබ සාමාන්‍යයෙන් ගොනුවක් අමතන විට එය සිදු වේ include,require හෝfopen හා PHP ගොනුව සොයා ගැනීමට හෝ ගොනුව පූරණය ප්රමාණවත් නොවේ අවසර ඇති විය හැකි.

මෙය විවිධ හේතු නිසා සිදුවිය හැකිය:

  • ගොනු මාර්ගය වැරදිය
  • ගොනු මාර්ගය සාපේක්ෂයි
  • ඇතුළත් කිරීම වැරදිය
  • අවසරයන් සීමිතයි
  • SELinux බලාත්මකයි
  • සහ තවත් බොහෝ දේ ...

එක් පොදු වැරැද්දක් නම් නිරපේක්ෂ මාර්ගයක් භාවිතා නොකිරීමයි. මෙය පහසුවෙන් සම්පූර්ණ මංපෙත කරමින් හෝ විසඳිය හැකි මැජික් නියත වැනි __DIR__හෝ dirname(__FILE__):

include __DIR__ . '/inc/globals.inc.php';

හෝ:

require dirname(__FILE__) . '/inc/globals.inc.php';

නිවැරදි මාවත භාවිතා කිරීම සහතික කිරීම මෙම ගැටළු නිරාකරණය කිරීමේ එක් පියවරකි, මෙය නොපවතින ලිපිගොනු, ගොනු පද්ධතියේ අයිතිවාසිකම් වැළැක්වීම හෝ PHP විසින්ම විවෘත පදනම් සීමා කිරීම් සම්බන්ධ විය හැකිය.

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

අදාළ ප්‍රශ්න:

අදාළ දෝෂ:


45

විග්‍රහ කිරීමේ දෝෂය: සින්ටැක්ස් දෝෂය, අනපේක්ෂිත T_PAAMAYIM_NEKUDOTAYIM

විෂය පථ විභේදන ක්‍රියාකරු හෙබ්‍රෙව් භාෂාවෙන් "පාමායිම් නෙකූඩොටයිම්" ලෙසද හැඳින්වේ. එහි තේරුම "ද්විත්ව බඩවැල්" යන්නයි.

ඔබ නොදැනුවත්ව තැබුවහොත් මෙම දෝෂය සාමාන්‍යයෙන් සිදුවේ :: ඔබේ කේතය ඇතුළත් .

අදාළ ප්‍රශ්න:

ප්‍රලේඛනය:


මෙම දෝෂය තුඩු දිය හැකි පහසුම මග ධාවනය වන a()::b;හෝ $a=::;.
ඉස්මයිල් මිගෙල්

44

දැනුම්දීම: නිර්වචනය නොකළ නියත XXX භාවිතය - උපකල්පනය කරන ලද 'XXX'

හෝ, PHP 7.2 හෝ ඊට පසු:

අවවාදයයි: නිර්වචනය නොකළ නියත XXX භාවිතය - උපකල්පනය කරන ලද 'XXX' (මෙය අනාගත PHP අනුවාදයක දෝෂයක් ඇති කරයි)

කේතයේ ටෝකනයක් භාවිතා කර නියතයක් ලෙස පෙනෙන විට මෙම දැනුම්දීම සිදු වේ, නමුත් එම නාමයෙන් නියතයක් අර්ථ දක්වා නැත.

මෙම දැන්වීමේ වඩාත් පොදු හේතුවක් වන්නේ සහායක අරා යතුරක් ලෙස භාවිතා කරන නූලක් උපුටා දැක්වීමට අපොහොසත් වීමයි.

උදාහරණයක් වශයෙන්:

// Wrong
echo $array[key];

// Right
echo $array['key'];

තවත් පොදු හේතුවක් වන්නේ $විචල්‍ය නාමයක් ඉදිරිපිට නැතිවූ (ඩොලර්) ලකුණකි:

// Wrong
echo varName;

// Right
echo $varName;

නැතහොත් ඔබ වෙනත් නියත හෝ මූල පදයක් අක්ෂර වින්‍යාසය කර ඇත:

// Wrong
$foo = fasle;

// Right
$foo = false;

ඔබ එම පුස්තකාලය මගින් අර්ථ දක්වා ඇති නියතයකට ප්‍රවේශ වීමට උත්සාහ කරන විට අවශ්‍ය PHP දිගුවක් හෝ පුස්තකාලයක් අස්ථානගත වී ඇති බවට ලකුණක් ද විය හැකිය.

අදාළ ප්‍රශ්න:


2
මම කියන්නේ වඩාත් පොදු හේතුව අරා නොව විචල්‍යයක් ඉදිරිපිට අමතක කිරීමයි.
Overv

42

මාරක දෝෂය: පන්තිය නැවත ප්‍රකාශ කළ නොහැක [පන්තියේ නම]

මාරක දෝෂය: නැවත ප්‍රකාශ කළ නොහැක [ශ්‍රිතයේ නම]

මෙයින් අදහස් කරන්නේ ඔබ එක්කෝ එකම ශ්‍රිතය / පංතියේ නම දෙවරක් භාවිතා කරන අතර ඒවායින් එකක් නැවත නම් කිරීම අවශ්‍ය වේ, නැතහොත් එයට හේතුව ඔබ භාවිතා කර ඇති නිසා requireහෝ includeඔබ භාවිතා කළ යුතු ස්ථානය require_onceහෝ include_once.

PHP හි පන්තියක් හෝ ශ්‍රිතයක් ප්‍රකාශයට පත් කළ විට එය වෙනස් කළ නොහැකි අතර පසුව එය නව අගයකින් ප්‍රකාශ කළ නොහැක.

පහත කේතය සලකා බලන්න:

class.php

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index.php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass;
   $obj->doSomething();
}

do_stuff();
do_stuff();

දෙවන ඇමතුම do_stuff()ඉහත දෝෂය ඇති කරයි. වෙනස් requireකිරීමෙන් require_once, අර්ථ දැක්වීම අඩංගු ගොනුව MyClassපටවනු ලබන්නේ එක් වරක් පමණක් බවත්, දෝෂය මඟහරවා ගත හැකි බවත් අපට සහතික විය හැකිය.


3
ස්වයංක්‍රීයව පැටවීම භාවිතා කිරීම සඳහන් කිරීම වටී ද? PSR-4 වැනි ප්‍රමිතීන් හෝ දැන් අතහැර දමා ඇති PSR-0 පවා අවශ්‍යතාවයෙන් / ඔබම ඇතුළත් කර ගැනීමට අවශ්‍ය වීමෙන් ඔබව ගලවා ගැනීමෙන් මෙය ඉවත් කරයි (විකාර අද්දර අවස්ථා කිහිපයක් වළක්වා ගන්න).
ඩැනියෙල්

40

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

ඔබ කලින් නිර්වචනය නොකළ විචල්‍යයක් භාවිතා කිරීමට උත්සාහ කරන විට සිදු වේ.

සාමාන්‍ය උදාහරණයක් වනු ඇත

foreach ($items as $item) {
    // do something with item
    $counter++;
}

ඔබ $counterකලින් නිර්වචනය නොකළේ නම් , ඉහත කේතය දැන්වීම අවුලුවනු ඇත.

නිවැරදි ක්‍රමය වනුයේ විචල්‍යය භාවිතා කිරීමට පෙර එය සැකසීමයි

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

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

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

$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
    // do something with item
    $obj->counter++;
}

අදාළ ප්‍රශ්න:


36

විග්‍රහ කිරීමේ දෝෂය: සින්ටැක්ස් දෝෂය, අනපේක්ෂිත T_VARIABLE

විය හැකි අවස්ථාව

මගේ කේතය වැරදී ඇත්තේ කොහෙන්දැයි මට නොපෙනේ. මෙන්න මගේ සම්පූර්ණ දෝෂය:

විග්‍රහ කිරීමේ දෝෂය: සින්ටැක්ස් දෝෂය, x පේළියේ අනපේක්ෂිත T_VARIABLE

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

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

පිළිතුර

විග්‍රහ කිරීමේ දෝෂය: ඔබේ වැඩසටහනේ වාක්‍ය ඛණ්ඩය පිළිබඳ ගැටළුවක්, එනම් ප්‍රකාශයක අවසානයෙන් අර්ධ සළකුණක් අතහැර දැමීම හෝ ඉහත සඳහන් කළ ආකාරයටම .ක්‍රියාකරු අතුරුදහන් වීම . විග්‍රහ කිරීමේ දෝෂයක් ඇති වූ විට ඔබේ වැඩසටහන ක්‍රියාත්මක කිරීම පරිවර්ථකයා නතර කරයි.

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

ඔබ කළ යුත්තේ කිසියම් සරල වැරැද්දක් සඳහා දෝෂය ඇති තැන අවට ඇති රේඛා හොඳින් පරීක්ෂා කිරීමයි.

එම දෝෂ පණිවිඩයේ අර්ථය වන්නේ ගොනුවේ x පේළියේ, PHP පරිවර්තකයා විවෘත වරහනක් දැකීමට අපේක්ෂා කළ නමුත් ඒ වෙනුවට එය හැඳින්වූ දෙයක් හමු වූ බවයි T_VARIABLE. එය T_VARIABLEa ලෙස හැඳින්වේ token. වැඩසටහන් වල විවිධ මූලික කොටස් ප්‍රකාශ කිරීමේ PHP පරිවර්තකයාගේ ක්‍රමය එයයි. පරිවර්තකය වැඩසටහනක කියවන විට, එය ඔබ ලියා ඇති දේ ටෝකන ලැයිස්තුවකට පරිවර්තනය කරයි. ඔබේ වැඩසටහනේ විචල්‍යයක් කොතැනක තැබුවද T_VARIABLE, පරිවර්තක ලැයිස්තුවේ ටෝකනයක් ඇත.

හොඳ කියවීම: පාර්සර් ටෝකන ලැයිස්තුව

එබැවින් ඔබ අවම වශයෙන් E_PARSEඔබගේ සක්‍රීය කර ඇති බවට වග බලා ගන්න php.ini. නිෂ්පාදන ස්ක්‍රිප්ට් වල විග්‍රහ දෝෂ නොවිය යුතුය.

කේතකරණයේදී පහත සඳහන් ප්‍රකාශය එක් කිරීමට මම සෑම විටම නිර්දේශ කළෙමි:

error_reporting(E_ALL);

PHP දෝෂ වාර්තා කිරීම

එසේම, IDE එකක් භාවිතා කිරීම හොඳ අදහසක් වන අතර එය ටයිප් කිරීමේදී දෝෂ විග්‍රහ කිරීමට ඔබට ඉඩ සලසයි. ඔයාට පාවිච්චි කරන්න පුළුවන්:

  1. නෙට්බීන්ස් (කදිම අලංකාරයක්, නිදහස් මෘදුකාංගයක්) (මගේ මතය අනුව හොඳම)
  2. PhpStorm (ගෝර්ඩන් මාමා මේකට කැමතියි: P, ගෙවූ සැලැස්ම, හිමිකාර සහ නිදහස් මෘදුකාංග අඩංගු වේ)
  3. සූර්යග්‍රහණය (අලංකාරය සහ මෘගයා, නිදහස් මෘදුකාංගය)

අදාළ ප්‍රශ්න:


35

දැනුම්දීම: ආරම්භ නොකළ නූල් ඕෆ්සෙට්: *

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

ඔබ සලකා බලන්න, සෑම ලිපියක්ම පෙන්වීමට උත්සාහ කරයි $string

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

ඉහත උදාහරණය ජනනය කරනු ඇත ( මාර්ගගත නිරූපණය ):

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

ස්ක්‍රිප්ට් එක ප්‍රතිරාවය කිරීම අවසන් වූ විගසම Dඔබට දෝෂය ලැබෙනු ඇත, මන්ද for()ලූපය ඇතුළත , ඔබ PHP ට පවසා ඇත්තේ පළමු සිට පස්වන වචන අක්‍ෂරය ඔබට පෙන්වන ලෙසයි 'ABCD', නමුත් පවතින, නමුත් ලූපය ගණන් කිරීමට පටන් ගෙන 0දෝංකාර දෙයි Dඑය ළඟා වන විට 4, එය ඕෆ්සෙට් දෝෂයක් ඇති කරයි.

සමාන දෝෂ:


34

දැනුම්දීම: වස්තු නොවන දෝෂයක දේපල ලබා ගැනීමට උත්සාහ කිරීම

වස්තුවක් නොමැති අතර වස්තුවක දේපලකට ප්‍රවේශ වීමට ඔබ උත්සාහ කරන විට සිදු වේ.

වස්තු නොවන දැන්වීමක් සඳහා සාමාන්‍ය උදාහරණයක් වනු ඇත

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

මෙම අවස්ථාවේ දී, $usersඅරාව (එබැවින් වස්තුවක් නොවේ) සහ එයට කිසිදු ගුණාංගයක් නොමැත.

මෙය නොපවතින දර්ශකයකට හෝ අරාවක යතුරකට ප්‍රවේශ වීමට සමාන වේ ( දැනුම්දීම: නිර්වචනය නොකළ දර්ශකය බලන්න ).

මෙම උදාහරණය බොහෝ සරල කර ඇත. බොහෝ විට එවැනි දැනුම්දීමක් මඟින් NULLසලකුණු නොකළ ප්‍රතිලාභ අගයක් සං als ා කරයි , උදා: පුස්තකාලයක් ආපසු පැමිණෙන විට වස්තුවක් නොපවතින විට හෝ අනපේක්ෂිත වස්තු නොවන අගයක් (උදා: එක්ස්පාත් ප්‍රති result ලයක, අනපේක්ෂිත ආකෘතියක් සහිත JSON ව්‍යුහයන්, අනපේක්ෂිත ආකෘතියක් සහිත XML ආදිය) නමුත් කේතය එවැනි තත්වයක් සඳහා පරීක්ෂා නොකරයි.

එම වස්තූන් නොවන බොහෝ විට තවදුරටත් ක්‍රියාවට නංවන බැවින්, බොහෝ විට මාරාන්තික දෝෂයක් සිදුවන්නේ වස්තුවක් නොවන වස්තුවක් ඇමතීමෙන් පසුව ය (බලන්න: මාරාන්තික දෝෂය: සාමාජික ශ්‍රිතයකට අමතන්න ... වස්තුවක් නොවන ) ස්ක්‍රිප්ට්.

දෝෂ තත්වයන් සහ / හෝ විචල්‍යයක් අපේක්ෂාවකට ගැලපෙන බව පරීක්ෂා කිරීමෙන් එය පහසුවෙන් වළක්වා ගත හැකිය. මෙන්න DOMXPath උදාහරණයක් සහිත එවැනි දැන්වීමක් :

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

ගැටළුව වන්නේ nodeValueපළමු අයිතමයේ දේපල (ක්ෂේත්‍රය) වෙත ප්‍රවේශ වීම වන අතර එය $resultඑකතුවෙහි තිබේද නැද්ද යන්න පරීක්ෂා කර නොමැත . ඒ වෙනුවට කේතය ක්‍රියාත්මක වන වස්තූන් සඳහා විචල්‍යයන් පැවරීමෙන් කේතය වඩාත් පැහැදිලිව දැක්වීමට එය ගෙවයි:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;

අදාළ දෝෂ:


1
json_decodeදැන් දැන් නිදසුනක් නැවත stdclassආදර්ශය කේතය නිසා, පෙරනිමියෙන් ඇත ඇත්තටම වැඩ කරනවා.
හියුගෝ සින්ක්

Ug හියුගෝසින්ක්: එය ඇත්ත වශයෙන්ම (සහ සෑම විටම) එම උදාහරණය සඳහා අරාවක් ලබා දෙයි: 3v4l.org/SUDe0 - එසේම " json_decodeදැන් stdclassපෙරනිමියෙන් උදාහරණයක් නැවත ලබා දෙයි " යනුවෙන් ඔබේ ලිවීම සඳහා කරුණාකර යොමු දැක්විය හැකිද? චේන්ජ්ලොග් තුළ මට එය සොයාගත නොහැක.
හක්රේ

Json_decode හි PHP අත්පොතේ පිටුවට අනුව , පෙරනිමියෙන්, assocපරාමිතිය සාවද්‍ය ලෙස සකසා ඇත. මෙම පරාමිතිය තීරණය කරන්නේ ශ්‍රිතය stdclassඅනුබද්ධ අරාව වෙනුවට නැවත ලබා දෙන්නේද යන්නයි .
හියුගෝ සින්ක්

json_decode('[{"name": "hakre"}]', true)නැවත අරාවක් ලබා දෙනු ඇත, එසේ stdclass
නොමැතිනම්

29

අවවාදයයි: බලපැවැත්වෙන පරිදි විවෘත_බැසිඩර් සීමා කිරීම

මෙම අනතුරු ඇඟවීම ගොනු සහ නාමාවලි ප්‍රවේශයට අදාළ විවිධ ක්‍රියාකාරකම් සමඟ දිස්විය හැකිය. එය වින්‍යාස කිරීමේ ගැටලුවක් ගැන අනතුරු අඟවයි.

එය දිස්වන විට, එයින් අදහස් වන්නේ සමහර ලිපිගොනු වලට ප්‍රවේශ වීම තහනම් කර ඇති බවයි.

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

නිවැරදි කිරීම සාමාන්‍යයෙන් PHP වින්‍යාසය වෙනස් කිරීම සඳහා වන අතර, අදාළ සැකසුම හැඳින්වේ open_basedir.

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

අදාළ ප්‍රශ්න:


1
මෙය බොහෝ විට සිදුවන්නේ හවුල් සත්කාරක සමාගමක වන අතර, මිනිසුන් සාමාන්‍යයෙන් නාමාවලි වලින් අගුලු
දමන්නේ නැත

28

විග්‍රහ කිරීමේ දෝෂය: සින්ටැක්ස් දෝෂය, අනපේක්ෂිත '['

මෙම දෝෂය ප්‍රභේද දෙකකින් පැමිණේ:

විචලනය 1

$arr = [1, 2, 3];

මෙම අරාව ආරම්භක සින්ටැක්ස් හඳුන්වා දුන්නේ PHP 5.4 හි පමණි; එය ඊට පෙර අනුවාදවල විග්‍රහ කිරීමේ දෝෂයක් මතු කරයි. හැකි නම්, ඔබේ ස්ථාපනය වැඩි දියුණු කරන්න හෝ පැරණි සින්ටැක්ස් භාවිතා කරන්න:

$arr = array(1, 2, 3);

අත්පොතෙන් මෙම උදාහරණයද බලන්න .

විචලනය 2

$suffix = explode(',', 'foo,bar')[1];

අරා විරූපණය කිරීමේ ක්‍රියාකාරී ප්‍රති results ල PHP 5.4 හි හඳුන්වා දී ඇත. උත්ශ්‍රේණිගත කිරීමට නොහැකි නම් ඔබට (තාවකාලික) විචල්‍යයක් භාවිතා කළ යුතුය:

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

අත්පොතෙන් මෙම උදාහරණයද බලන්න .


23

අවවාදයයි: [ශ්‍රිතය] 1 පරාමිතිය සම්පතක් වනු ඇතැයි අපේක්ෂා කරයි

( අනතුරු ඇඟවීමේ වඩාත් පොදු විචලනය : mysql_fetch_array () 1 පරාමිතිය සම්පතක් වනු ඇතැයි අපේක්ෂා කරයි, බූලියන් ලබා දී ඇත )

සම්පත් යනු PHP හි වර්ගයකි (නූල්, නිඛිල හෝ වස්තු වැනි). සම්පතක් යනු තමන්ගේම සහජයෙන්ම අර්ථවත් වටිනාකමක් නැති පාරාන්ධ මලකි. සම්පතක් නිශ්චිත PHP ශ්‍රිත සමූහයකට හෝ ව්‍යාප්තියකට නිශ්චිත හා අර්ථ දක්වා ඇත. උදාහරණයක් ලෙස, Mysql දිගුව සම්පත් වර්ග දෙකක් අර්ථ දක්වයි :

MySQL මොඩියුලයේ සම්පත් වර්ග දෙකක් භාවිතා වේ. පළමුවැන්න දත්ත සමුදා සම්බන්ධතාවයක් සඳහා සම්බන්ධක හඳුනාගැනීමක් වන අතර දෙවැන්න විමසුමක ප්‍රති result ල දරණ සම්පතකි.

CURL දිගුව තවත් සම්පත් වර්ග දෙකක් අර්ථ දක්වයි :

... CURL හසුරුව සහ CURL බහු හසුරුව.

var_dumpසංස්කරණය කළ විට , අගයන් මේ ආකාරයෙන් පෙනේ:

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

බොහෝ සම්පත් වන්නේ, (1)එක්තරා ආකාරයක ( (curl)) සංඛ්‍යාත්මක හඳුනාගැනීමක් ( ) ය .

ඔබ මෙම සම්පත් වටා ගෙන ගොස් එවැනි සම්පතක් යමක් අදහස් කරන විවිධ කාර්යයන් වෙත යොමු කරයි. සාමාන්‍යයෙන් මෙම කාර්යයන් පසුබිමේ යම් දත්ත වෙන් කරන අතර සම්පතක් යනු මෙම දත්ත අභ්‍යන්තරව නිරීක්ෂණය කිරීම සඳහා ඔවුන් භාවිතා කරන යොමු කිරීමකි.


" ... පරාමිති 1 සම්පතක් වනු ඇතැයි අපේක්ෂා කරයි, බූලියන් ලබා දී ඇත " දෝෂය සාමාන්‍යයෙන් සම්පතක් නිර්මාණය කිරීමට බලාපොරොත්තු නොවූ, නමුත් falseඒ වෙනුවට ආපසු ලබා දෙන ලද පරීක්ෂා නොකළ මෙහෙයුමක ප්‍රති result ලයකි . උදාහරණයක් ලෙස, fopenශ්‍රිතයට මෙම විස්තරය ඇත:

ප්‍රතිලාභ වටිනාකම්

සාර්ථකත්වය FALSEමත හෝ දෝෂයක් මත ගොනු දර්ශක සම්පතක් ලබා දෙයි .

එබැවින් මෙම කේතයේ, $fpඑක්කෝ resource(x) of type (stream)හෝ false:

$fp = fopen(...);

ඔබ යන්න පරික්ෂා නොවේ නම් fopenයන්න මෙහෙයුම සාර්ථක හෝ අසාර්ථක විය සහ ඒ නිසා $fpවලංගු සම්පත් හෝ falseහා සම්මත $fpසම්පතක් අපේක්ෂා කරන තවත් කාර්යය කිරීම සඳහා, ඔබ විසින් ඉහත දෝෂය ලබා ගැනීමට හැකි වනු ඇත:

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

සම්පතක් වෙන් කිරීමට උත්සාහ කරන සහ අසමත් විය හැකි ශ්‍රිතවල ප්‍රතිලාභ අගය ඔබ සැමවිටම වැරදියට පරීක්ෂා කළ යුතුය :

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

අදාළ දෝෂ:


22

අවවාදයයි: නීති විරෝධී නූල් ඕෆ්සෙට් 'XXX'

මෙය සිදු වන්නේ ඔබ වර්ග වරහන් සින්ටැක්ස් සමඟ අරාව මූලද්‍රව්‍යයකට ප්‍රවේශ වීමට උත්සාහ කරන විට ය, නමුත් ඔබ මෙය කරන්නේ නූලක් මත මිස අරාව මත නොවේ, එබැවින් මෙහෙයුම පැහැදිලිවම තේරුමක් නැත .

උදාහරණයක්:

$var = "test";
echo $var["a_key"];

විචල්‍යය අරාව විය යුතු යැයි ඔබ සිතන්නේ නම්, එය පැමිණෙන්නේ කොහෙන්දැයි බලන්න සහ එහි ගැටළුව විසඳන්න.


20

කේතය ක්‍රියාත්මක නොවේ / මගේ PHP කේතයේ කොටස් ප්‍රතිදානය ලෙස පෙනේ

ඔබගේ PHP කේතයෙන් කිසිදු ප්‍රති result ලයක් ඔබ නොදන්නේ නම් සහ / හෝ ඔබේ වචනයේ පරිසමාප්ත අර්ථයෙන්ම PHP ප්‍රභව කේත ප්‍රතිදානයේ වෙබ් පිටුවේ ඔබ දකින්නේ නම්, ඔබේ PHP සැබවින්ම ක්‍රියාත්මක නොවන බවට ඔබට සහතික විය හැකිය. ඔබ ඔබගේ බ්‍රව්සරයේ View Source භාවිතා කරන්නේ නම්, බොහෝ විට ඔබ මුළු PHP ප්‍රභව කේත ගොනුවම දකිනු ඇත. PHP කේතය <?php ?>ටැග් වලට ඇතුළත් කර ඇති බැවින්, බ්‍රව්සරය ඒවා HTML ටැග් ලෙස අර්ථ නිරූපණය කිරීමට උත්සාහ කරන අතර ප්‍රති result ලය තරමක් ව්‍යාකූල විය හැකිය.

ඔබේ PHP ස්ක්‍රිප්ට් සැබවින්ම ක්‍රියාත්මක කිරීමට ඔබට අවශ්‍ය වන්නේ:

  • ඔබේ ස්ක්‍රිප්ට් ක්‍රියාත්මක කරන වෙබ් සේවාදායකයක්
  • ගොනු දිගුව .php ලෙස සැකසීමට, එසේ නොමැතිනම් වෙබ් සේවාදායකයා එය එසේ අර්ථ නිරූපණය නොකරයි *
  • ඔබේ .php ගොනුවට වෙබ් සේවාදායකය හරහා ප්‍රවේශ වීමට

* ඔබ එය නැවත සකස් නොකරන්නේ නම්, සියල්ල වින්‍යාසගත කළ හැකිය.

මෙම අන්තිම එක විශේෂයෙන් වැදගත් ය. ගොනුව දෙවරක් ක්ලික් කිරීමෙන් ඔබගේ බ්‍රව්සරයේ එය වැනි ලිපිනයක් භාවිතා කර විවෘත වනු ඇත:

file://C:/path/to/my/file.php

මෙය ඔබ ධාවනය කර ඇති ඕනෑම වෙබ් සේවාදායකයක් මුළුමනින්ම මග හරින අතර ගොනුව අර්ථ නිරූපණය නොකෙරේ. ඔබගේ වෙබ් සේවාදායකයේ ඇති ගොනුවේ URL වෙත ඔබ පිවිසිය යුතුය.

http://localhost/my/file.php

ඔබ <?ඒ වෙනුවට කෙටි විවෘත ටැග් භාවිතා කරනවාද යන්න පරීක්ෂා කිරීමට ඔබට අවශ්‍ය විය හැකි <?phpඅතර ඔබේ PHP වින්‍යාසය කෙටි විවෘත ටැග් අක්‍රිය කර ඇත.

PHP කේතය ක්‍රියාත්මක නොවන බව බලන්න , ඒ වෙනුවට පිටුවේ කේත පෙන්වයි


19

දැනුම්දීම: නූල් පරිවර්තනයට අරා

ඔබ අරාව නූල් ලෙස සැලකීමට උත්සාහ කරන්නේ නම් මෙය සරලවම සිදුවේ:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

echoප්‍රති a ලය මනාව නිර්වචනය කර නැති නිසා අරාවකට හුදෙක් නූලක් සමඟ සංයුක්ත කළ නොහැක. PHP විසින් අරාව වෙනුවට "අරාව" නූල භාවිතා කරනු ඇති අතර, එය බොහෝ විට අදහස් කර ඇති දේ නොවන බවත් ඔබේ කේතය මෙහි පරීක්ෂා කර බැලිය යුතු බවත් පෙන්වා දීමට දැන්වීම ක්‍රියාත්මක කරයි. ඒ වෙනුවට ඔබට මේ වගේ දෙයක් අවශ්‍ය විය හැකිය:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

නැතහොත් අරාව ලූප කරන්න:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

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


18

අවවාදයයි: mysql_connect (): පරිශීලක 'නම' host 'සත්කාරක' සඳහා ප්‍රවේශය ප්‍රතික්ෂේප කරන ලදි.

අවලංගු හෝ නැතිවූ අක්තපත්‍ර (පරිශීලක නාමය / මුරපදය) සමඟ ඔබ MySQL / MariaDB සේවාදායකයකට සම්බන්ධ වන විට මෙම අනතුරු ඇඟවීම පෙන්වයි. ඒ නිසා මෙම සාමාන්යයෙන් නොවන කේත ප්රශ්නයක්, නමුත් සේවාදායකය මානකරණය ප්රශ්නය.

  • mysql_connect("localhost", "user", "pw")උදාහරණ සඳහා අත්පොත පිටුව බලන්න .

  • ඔබ සැබවින්ම භාවිතා කළේ $usernameසහ $password.

    • මුරපදයක් නොමැතිව ඔබට ප්‍රවේශය ලැබීම සාමාන්‍ය දෙයකි - අවවාදයයි: සිදු වූ විට සිදු වූයේ එයයි (using password: NO).
    • සාමාන්‍යයෙන් පරිශීලක නාමය root, මුරපදයක් සහ testදත්ත සමුදා නාමය සමඟ සම්බන්ධ වීමට ඉඩ දෙන්නේ දේශීය පරීක්ෂණ සේවාදායකයාට පමණි .

    • විධාන රේඛා සේවාදායකයා භාවිතයෙන් ඒවා ඇත්ත වශයෙන්ම නිවැරදි දැයි ඔබට පරීක්ෂා කළ හැකිය :
      mysql --user="username" --password="password" testdb

    • පරිශීලක නාමය සහ මුරපදය සිද්ධි සංවේදී වන අතර හිස් අවකාශය නොසලකා හරිනු නොලැබේ . ඔබගේ මුරපදයේ මෙටා අක්ෂර අඩංගු නම් $, ඒවායින් බේරෙන්න, හෝ මුරපදය තනි උපුටා දැක්වීම් වලට දමන්න .

    • බොහෝ හවුල් සත්කාරක සැපයුම්කරුවන් යුනික්ස් පරිශීලක ගිණුමට සාපේක්ෂව mysql ගිණුම් පුරෝකථනය කරයි (සමහර විට උපසර්ග හෝ අතිරේක සංඛ්‍යා උපසර්ග). රටාවක් හෝ ලියකියවිලි සඳහා ලියකියවිලි සහ මුරපදයක් සැකසීම සඳහා CPanel හෝ ඕනෑම අතුරු මුහුණතක් බලන්න.

    • විධාන රේඛාව භාවිතා කර පරිශීලක ගිණුම් එකතු කිරීම පිළිබඳ MySQL අත්පොත බලන්න . පරිපාලක පරිශීලකයෙකු ලෙස සම්බන්ධ වූ විට ඔබට මෙවැනි විමසුමක් නිකුත් කළ හැකිය:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • හෝ ගිණුම් විස්තර නිර්මාණය කිරීමට, පරීක්ෂා කිරීමට හෝ නිවැරදි කිරීමට පරිපාලක හෝ වර්ක්බෙන්ච් හෝ වෙනත් චිත්‍රක මෙවලමක් භාවිතා කරන්න.

    • ඔබේ අක්තපත්ර නිවැරදි කිරීමට ඔබට නොහැකි නම්, "කරුණාකර උදව් කරන්න" යනුවෙන් අන්තර්ජාලය ඉල්ලා සිටීම කිසිදු බලපෑමක් ඇති නොකරනු ඇත. ඔබට සහ ඔබේ සත්කාරක සැපයුම්කරුට පමණක් අවසර සහ දේවල් හඳුනා ගැනීමට සහ නිවැරදි කිරීමට ප්‍රමාණවත් ප්‍රවේශයක් ඇත.

  • ඔබේ සැපයුම්කරු විසින් ලබා දී ඇති ධාරක නාමය භාවිතා කරමින් ඔබට දත්ත සමුදා සේවාදායකයට ළඟා විය හැකි බව තහවුරු කරන්න :
    ping dbserver.hoster.example.net

    • ඔබේ වෙබ් සේවාදායකයේ කෙලින්ම SSH කොන්සෝලයකින් මෙය පරීක්ෂා කරන්න. ඔබේ ප්‍රාදේශීය සංවර්ධන සේවාදායකයාගේ සිට ඔබේ හවුල් සත්කාරක සේවාදායකය වෙත පරීක්ෂා කිරීම කලාතුරකින් අර්ථවත් නොවේ.

    • බොහෝ විට ඔබට අවශ්‍ය වන්නේ සේවාදායකයේ නම වීමයි "localhost", එය සාමාන්‍යයෙන් දේශීය නම් සොකට් එකක් ලබා ගත හැකිය. වෙනත් වේලාවන් ඔබට පසුබෑමක් "127.0.0.1"ලෙස උත්සාහ කළ හැකිය .

    • ඔබගේ MySQL / MariaDB සේවාදායකය වෙනත් වරායකට සවන් දිය යුතු නම්, පසුව භාවිතා කරන්න "servername:3306".

    • එය අසමත් වුවහොත්, සමහර විට ෆයර්වෝල් ගැටලුවක් තිබේ. (මාතෘකාවෙන් බැහැරව, ක්‍රමලේඛන ප්‍රශ්නයක් නොවේ. දුරස්ථ අනුමාන-උදව් කළ නොහැක.)

  • උදා හෝ නියතයන් භාවිතා කරන විට , ඒවා සැබවින්ම අර්ථ දක්වා ඇත්දැයි පරීක්ෂා කරන්න .DB_USERDB_PASSWORD

    • ඔබ a "Warning: Access defined for 'DB_USER'@'host'"සහ a ලබා ගන්නේ නම් "Notice: use of undefined constant 'DB_PASS'", එය ඔබේ ගැටලුවයි.

    • ඔබේ උදා: xy/db-config.phpඇත්ත වශයෙන්ම ඇතුළත් කර ඇති බව තහවුරු කරගන්න.

  • නිවැරදිව සකසා ඇති GRANTඅවසරයන් සඳහා පරීක්ෂා කරන්න .

    • username+ passwordයුගලයක් තිබීම ප්‍රමාණවත් නොවේ .

    • සෑම MySQL / MariaDB ගිණුමකට අනුයුක්ත අවසර කට්ටලයක් තිබිය හැකිය.

    • ඔබට සම්බන්ධ වීමට අවසර දී ඇති දත්ත සමුදායන්, සම්බන්ධතාවය කුමන සේවාදායකයා / සේවාදායකයා වෙතින් ආරම්භ විය හැකිද, සහ කුමන විමසුම් වලට අවසර තිබේද යන්න ඒවාට සීමා කළ හැකිය.

    • නිශ්චිත වගුවකින් හෝ / සහ වඩාත් පොදු ඕනෑම දෙයකින් mysql_queryඔබට අවසර නොමැති නම් “ප්‍රවේශය ප්‍රතික්ෂේප කරන” අනතුරු ඇඟවීම ඇමතුම් සඳහාද පෙන්වනු ඇත .SELECTINSERTUPDATEDELETE

    • විධාන රේඛා සේවාදායකයෙකුට පරිපාලක ගිණුම භාවිතා කරමින් සම්බන්ධ වූ විට ඔබට ගිණුම් අවසරයන් අනුවර්තනය කළ හැකිය :
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • අනතුරු ඇඟවීම පළමුව පෙන්වන්නේ Warning: mysql_query(): Access denied for user ''@'localhost'නම් ඔබට php.ini- පෙර සැකසූ ගිණුමක් / මුරපද යුගලයක් තිබිය හැකිය.

    • බව පරීක්ෂා කරන්න mysql.default_user=සහ mysql.default_password=අර්ථවත් වටිනාකම් තියෙනවා.

    • බොහෝ විට මෙය සැපයුම්කරුගේ වින්‍යාසය වේ. එබැවින් නොගැලපීම් සඳහා ඔවුන්ගේ සහාය අමතන්න.

  • ඔබගේ හවුල් සත්කාරක සැපයුම්කරුගේ ලියකියවිලි සොයා ගන්න:

  • ඔබ ලබා ගත හැකි සම්බන්ධතා සංචිතයඅඩුවී ඇති බව සලකන්න . සමගාමී සම්බන්ධතා බොහොමයක් සඳහා ඔබට ප්‍රවේශය ප්‍රතික්ෂේප කළ අනතුරු ඇඟවීම් ලැබෙනු ඇත. (ඔබ සැකසුම විමර්ශනය කළ යුතුය. එය මාතෘකාවෙන් බැහැර සේවාදායක වින්‍යාස කිරීමේ ගැටලුවක් මිස ක්‍රමලේඛන ප්‍රශ්නයක් නොවේ.)

  • ඔබගේ libmysql ග්‍රාහක අනුවාදය දත්ත සමුදා සේවාදායකය සමඟ නොගැලපේ . සාමාන්‍යයෙන් MySQL සහ MariaDB සේවාදායකයන් ධාවකයේ සම්පාදනය කරන ලද PHP සමඟ ළඟා විය හැකිය. ඔබට අභිරුචි සැකසුමක් හෝ යල් පැන ගිය PHP අනුවාදයක් සහ වඩා නව දත්ත සමුදා සේවාදායකයක් හෝ සැලකිය යුතු ලෙස යල් පැන ගිය එකක් තිබේ නම් - අනුවාදයේ නොගැලපීම සම්බන්ධතා වලක්වනු ඇත. (නැත, ඔබ ඔබම විමර්ශනය කළ යුතුය. ඔබේ සැකසුම කිසිවෙකුට අනුමාන කළ නොහැක).

තවත් යොමු:

Btw, ඔබට mysql_*තවදුරටත් කාර්යයන් භාවිතා කිරීමට අවශ්‍ය නොවනු ඇත. නවක සාමාජිකයන්ට ප්රයෝජනවත් විය බොහෝ විට සංක්රමණය mysqli කෙසේ වෙතත් දැන් වෙහෙසකාරී ලෙස වන. ඒ වෙනුවට පීඩීඕ කියවා ප්‍රකාශ සකස් කරන්න .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


2
mysql මඟින් php-ini සැකසුම් හරහා ස්වයංක්‍රීයව සම්බන්ධ වීමට ඉඩ ලබා දේ, පසුව එකම පෙරනිමි වෙනස් විධානයක් සමඟ එකම දෝෂ පණිවිඩයක් ලබා දෙනු ලැබේ, උදා: "අවවාදයයි: mysql_query (): පරිශීලක 'local' localhost '(මුරපදය භාවිතා කරමින්: NO) සඳහා ප්‍රවේශය ප්‍රතික්ෂේප කරන ලදි. .. " - නිකම්ම සඳහන් කිරීම.
හක්රේ

හා, ඒ ගැන මුළුමනින්ම අමතක වී ඇත! (බොහෝ විට අවසන් වරට එය භාවිතා කළේ PHP3 හෝ වෙනත් ආකාරයකින් ..)
මාරියෝ

13

අවවාදයයි: ශුන්‍යයෙන් බෙදීම

'ශුන්‍යයෙන් බෙදීම' යන අනතුරු ඇඟවීමේ පණිවිඩය නව PHP සංවර්ධකයින් අතර බහුලව අසනු ලබන ප්‍රශ්නයකි. මෙම දෝෂය ව්‍යතිරේකයක් ඇති නොකරනු ඇත, එබැවින් සමහර සංවර්ධකයින් ඉඳහිට දෝෂ මර්දනය කිරීමේ ක්‍රියාකරු the ප්‍රකාශනයට පෙර එකතු කිරීමෙන් අනතුරු ඇඟවීම යටපත් කරනු ඇත. උදාහරණයක් වශයෙන්:

$value = @(2 / 0);

එහෙත්, ඕනෑම අනතුරු ඇඟවීමක් මෙන්, හොඳම ප්‍රවේශය වනුයේ අනතුරු ඇඟවීමට හේතුව සොයා බලා එය විසඳීමයි. අනතුරු ඇඟවීමට හේතුව පැමිණෙන්නේ ඔබ 0 න් බෙදීමට උත්සාහ කරන ඕනෑම අවස්ථාවක, 0 ට සමාන විචල්‍යයක් හෝ පවරා නොමැති විචල්‍යයක් (NULL == 0 නිසා) ප්‍රති result ලය 'නිර්වචනය නොකළ' බැවිනි.

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

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

අදාළ ප්‍රශ්න:


එය 0 නම් 1 ට සැකසීම දෝෂය නවත්වනු ඇත, නමුත් මෙය භාවිතා නොකළ යුතු යැයි ඔබ කී මර්දනයට වඩා හොඳද (මම එකඟ වන)? මම බොහෝ විට යෝජනා කරන්නේ එය වෙනත් පණිවිඩයක් හෝ වටිනාකමක් ආපසු ලබා දෙනු ඇති බවයි.
ජේම්ස්

මෙම උදාහරණයක් ලෙස, නම් $var1== 0 කරන්නේ නම් ඔබ සැකසිය හැක $var3කිරීමට $var2. එසේ නොමැති වෙන සකාට පිටත අවස්ථා දෙකේදීම සියලු දී පැවරුම හා සමාන වේ ලෙස වෙන අවශ්ය නැත, එසේ කරන්නේ පවා නොමැතිif
ජේම්ස්

8

දැඩි ප්‍රමිති: ස්ථිතික නොවන ක්‍රමය [<class> :: <method>] ස්ථිතික ලෙස හැඳින්විය යුතු නොවේ

පංතියක ස්ථිතික නොවන බැවින් ස්ථිතික නොවන ක්‍රමයක් ඇමතීමට ඔබ උත්සාහ කරන විට සිදු වන E_STRICTඅතර ඔබේ error_reporting()සැකසුම් තුළ ධජයද ඇත .

උදාහරණයක් :

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br() හෝ $html::br()

ඇත්ත වශයෙන්ම ඔබ එක් නොවන මෙම දෝෂය මඟහරවා ගත හැකිය E_STRICTකිරීමට error_reporting(), උදා:

error_reporting(E_ALL & ~E_STRICT);

PHP 5.4.0 සහ ඊට ඉහළින් [ ref ] E_STRICTහි ඇතුළත් කර ඇති බැවින් . නමුත් එය සුදුසු නොවේ. විසඳුම නම් ඔබ අපේක්ෂිත ස්ථිතික ශ්‍රිතය සත්‍ය ලෙස අර්ථ දැක්වීම ය :E_ALLstatic

public static function br() {
  echo '<br>';
}

හෝ ශ්‍රිතය සාම්ප්‍රදායිකව අමතන්න:

$html = new HTML();
$html->br();

අදාළ ප්‍රශ්න:


8

මාරක දෝෂය: පන්ති වසා දැමීමේ වස්තුව නූලකට පරිවර්තනය කළ නොහැක

එයින් අදහස් වන්නේ ඔබ ඔබේ නිර්නාමික ශ්‍රිතය (හෝ වසා දැමීමක්) ක්‍රියාත්මක නොකරන බවයි.

ඊතල ශ්‍රිත භාවිතා කරමින් මෙම උදාහරණය සඳහා දෝෂයක් විසි වේ:

echo $fn = fn($x = 42) => $x;

හෝ ඕනෑම නිර්නාමික කාර්යයක් සඳහා

echo function($x = 42) { return $x; };

මෙම දෝෂය නිරාකරණය කිරීම සඳහා ඔබ වසා දැමීම ක්‍රියාත්මක කළ යුතුය.

echo $fn = (fn($x = 42) => $x)(30); // take notice of the 2 sets of brackets

echo (function($x = 42) { return $x; })(30);

මේ ආකාරයේ සින්ටැක්ස් IIFE ලෙස හැඳින්වෙන අතර එය PHP 7 හි එකතු කරන ලදී .

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.