შინაარსზე გადასვლა

PHP/PHP - შეცდომა

ვიკიწიგნებიდან
< PHP

PHP შეცდომის შეტყობინება

[რედაქტირება]

როდესაც ვქმნით სკრიპტებს და ვებ პროგრამებს, შეცდომის გამოტანა არის საკმაოდ მნიშვნელოვანი. თუკი ჩვენ კოდს არ აქვს კოდში შეცდომების შემოწმების საშუალება, ჩვენი პროგრამა იქნება არაპროფესიონალური და შესაძლოა დაუცველი.
არსებობს შეცდომის გამოტანის რამოდენიმე საშუალება:

  • უბრალო "die()" ოპერატორები
  • ინდივიდუალური შეცდომები და შეცდომის კვანძები
  • შეცდომის ანგარიშები

ბაზური შეცდომის შეტყობინება: DIE() ფუნქციის გამოყენება

[რედაქტირება]

პირველი მაგალითი გვაჩვენებს უბრალო სკრიპტს, რომელიც ხსნის ტექსტურ ფაილს:

<?php
$file=fopen("welcome.txt","r");
?>

თუ ფაილი არ არსებობს ჩვენ მივიღებთ მსგავს შეცდომას:

Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: 
No such file or directory in C:\webfolder\test.php on line 2

იმისათვის რომ მომხმარებელმა არ მიიღოს მსგავსი შეტყობინება, მანამ, სანამ მოვითხოვთ ფაილს, უნდა დავტესტოთ არსებობს იგი თუ არა:

<?php
if(!file_exists("welcome.txt"))
 {
 die("File not found");
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
?>

ახლა უკვე თუ ფაილი არ არსებობს, გამოვა მსგავსი შეტყობინება:

File not found

ეს კოდი უფრო ეფექტურია ვიდრე პირველი, რადგან ეს იყენებს სკრიპტის გაჩერებისათვის შეცდომის გამოტანის უბრალო მექანიზმს. თუმცა, სკრიპტის შეჩერება ყოველთვის არაა სასურველი. განვიხილოთ შეცდომის გამოტანის ალტერნატიული PHP ფუნქციები.

ინდივიდუალური შეცდომის შეტყობინების შექმნა

[რედაქტირება]

ინდივიდუალური შეცდომის შეტყობინების შექმნა საკმაოდ ადვილია. ჩვენ უბრალოდ შევქმნით სპეციალურ ფუნქციას , რომელიც გამოიძახება PHP-ში შეცდომის შემთხვევაში.
სინტაქსი:

error_function(error_level,error_message,
error_file,error_line,error_context)
ინდივიდუალური შეცდომის შეტყობინების შექმნა
პარამეტრი აღწერა
error_level აუცილებელი. შეცდომის დონის სპეციფიკაცია. მნიშვნელობა უნდა იყოს რიცხვი
error_message აუცილებელი. შეცდომის შეტყობინების სპეციფიკაცია
error_file არა აუცილებელი. ფაილის სახელის სპეციფიკაცია, რომელშიც აღმოჩნდა შეცდომა
error_line არა აუცილებელი. ხაზის ნომრის სპეციფიკაცია, რომელშიც აღმოჩნდა შეცდომა
error_context არა აუცილებელია. ყველა ცვლადის და მათი მნიშვნელობების შემცველი მასივის სპეციფიკაცია, რომელთა გამოყენების დროსაც აღმოჩნდა შეცდომა

შეცდომის დონე

[რედაქტირება]

შეცდომის დონეები:


შეცდომის დონეები
მნიშვნელობა მუდმივი აღწერა
2 E_WARNING არა გარდაუვალი ”რან-თაიმ” შეცდომა. სკრიპტის მუშაობა არ შეჩერდება
8 E_NOTICE ”რან-თაიმ” განცხადება. სკრიპტმა იპოვა რაღაც, რომელის შესაძლოა იყოს შეცდომა
256 E_USER_ERROR სამომხმარებლოს გარდაუვალი შეცდომა. ეს მსგავსია პროგრამისტის მიერ PHP ფუნქცია trigger_error()-ის გამოყენებით დასმული E_ERROR-სა
512 E_USER_WARNING არა გარდაუვალი სამომხმარებლო გაფრთხილება. ეს მსგავსია პროგრამისტის მიერ PHP ფუნქცია trigger_error()-ის გამოყენებით დასმული E_WARNING-სა
1024 E_USER_NOTICE სამომხმარებლო განცხადება. ეს მსგავსია პროგრამისტის მიერ PHP ფუნქცია trigger_error()-ის გამოყენებით დასმული E_NOTICE -სა
4096 E_RECOVERABLE_ERROR დამჭერი გარდაუვალი შეცდომა. ეს მსგავსია E_ERROR-სა, მაგრამ შესაძლოა გამოიწვიოს მომხმარებლის განსაზღვრულმა ქმედებამ
8191 E_ALL ყველა შეცდომა და გაფრთხილება, გარდა E_STRICT -სა

ახლა შევქმნათ შეცდომის შეტყობინების ფუნქცია:

function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "Ending Script";
 die();
 }

ზემოთ მოყვანილი კოდი არის უბრალო შეცდომის გამოტანის ფუნქცია. როდესაც ის გაეშვება, ის იღებს შეცდომის დონეს და შეცდომის შეტყობინებას. ის შემდეგ დაბეჭდავს შეცდომის დონეს და შეტყობინებას და შეაჩერებს სკრიპტის მუშაობას.
ახლა, როდესაც ჩვენ შევქმენით შეცდომის გამოტანის ფუნქცია, ჩვენ უნდა გადავწყვიტოთ თუ როდის გავუშვათ იგი.

შეცდომის შეტყობინების დასმა

[რედაქტირება]

PHP-სთვის სტანდარტული შეცდომის შეტყობინება არის ჩაშენებული შეცდომის გამომტანი. ზემოთ ჩვენ ვცდილობთ შევქმნათ სტანდარტული შეცდომის გამოტანის ფუნქცია სკრიტის მუშაობის დროისათვის.
შესაძლებელია შეიცვალოს შეცდომის გამომტანი, რათა ის გამოვიყენოთ მხოლოდ რამოდენიმე შეცდომაზე. ამ გზით სკრიპტს შეუძლია მართოს სხვადასხვა შეცდომები, სხვადასხვა გზით. თუმცა, ამ მაგალითში შევქმნით ჩვენთვის სასურველ შეცდომას ყოველი შეცდომისათვის:

set_error_handler("customError");

მას შემდეგ, რაც ჩვენ მოვინდომებთ რომ ჩვენმა ფუნქციამ გამოიტანოს ყველა შეცდომა, set_error_handler()-ს სჭირდება მხოლოდ ერთი პარამეტრი, ხოლო მეორე პარამეტრი დასჭირდება შეცდომის დონის სპეციფიკაციისათვის.
მაგალითი:
დავტესტოთ შეცდომის გამომტანი, იმ ცვლადის დაბეჭდვით, რომელიც არ არსებობს:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr";
 }
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>

კოდი დაბეჭდავს მსგავსს:

Custom error: [8] Undefined variable: test

შეცდომის გაშვება

[რედაქტირება]

სკრიპტში სადაც მომხმარებელს შეუძლია შეიყვანოს მონაცემები, საკმაოდ გამოყენებადია გავუშვათ შეცდომა, როდესაც აღმოჩენილ იქნება არალეგალური მონაცემები. PHP-ში ეს ხდება trigger_error() ფუნქციით.
მაგალითი:
მაგალითში გამოვა შეცდომა, თუ "test" ცვლადი მეტია, ვიდრე "1":

<?php
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below");
}
?>

კოდი დაბეჭდავს მსგავსს:

Notice: Value must be 1 or below
in C:\webfolder\test.php on line 6

შეცდომის გაშვება შესაძლებელია სკრიპტში, ნებისმიერ ადგილზე და მეორე პარამეტრის დამატებით, ჩვენ შეგვიძლია შეცდომის დონის სპეციფიკაციის გაკეთება.
შესაძლო შეცდომის ტიპები:

  • E_USER_ERROR - გარდაუვალი სამომხმარებლო რან-თაიმ შეცდომა. სკრიპტის მუშაობა შეჩერდება.
  • E_USER_WARNING - არაგარდაუვალი სამომხმარებლო რან-თაიმ გაფრთხილება. სკრიპტის მუშაობა არ ჩერდება.
  • E_USER_NOTICE - სტანდარტული. სამომხმარებლო რან-თაიმ შენიშვნა. სკრიპტმა იპოვა რაღაც, რომელიც შესაძლოა იყოს შეცდომა.

მაგალითი:
ეს არის E_USER_WARNING მაგალითი. გამოვა შეცდომა, თუ "test" ცვლადი მეტია, ვიდრე "1". თუ E_USER_WARNING გამოვა ჩვენ გამოვიყენებთ ჩვენ მიერ შექმნილ შეცდომის გამოტანას და შევაჩერებთ სკრიპტის მუშაობას:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "Ending Script";
 die();
 }
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Value must be 1 or below",E_USER_WARNING);
 }
?>

კოდი დაბეჭდავს მსგავსს:

Error: [512] Value must be 1 or below
Ending Script

ახლა უკვე როდესაც ვისწავლეთ საკუთარი შეცდომების შექმნა და მათი გაშვება, შევისწავლოთ შეცდომის აღრიცხვა.

შეცდომის აღრიცხვა

[რედაქტირება]

სტანდარტულად, PHP აგზავნის შეცდომის აღრიცხვას სერვერის აღრიცხვის სისტემაზე, ან ფაილს დამოკიდებული, თუ როგორი error_log კონფიგურაცია არის დასმული php.ini ფაილში. error_log() ფუნქციის გამოყენებით ჩვენ შეგვიძლია გავგზავნოთ შეცდომის აღრიცხვები სპეციფიურ ფაილში, ან მთავარი დანიშნულების ადგილას.
შეცდომების შეტყობინებების გაგზავნა ელ-ფოსტით შესაძლოა იყოს კარგი გზა სპეციფიური შეცდომების შეტყობინებისათვის.

შეცდომის შეტყობინების გაგზავნა ელ-ფოსტაზე

[რედაქტირება]

ქვემოთ მოყვანილ მაგალითში, თუ მოხდება სპეციფიური შეცდომა ჩვენ გავგზავნით ფოსტას შეცდომის შეტყობინებით და დავასრულებთ სკრიპტის მუშაობას:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "Webmaster has been notified";
 error_log("Error: [$errno] $errstr",1,
 "someone@example.com","From: webmaster@example.com");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Value must be 1 or below",E_USER_WARNING);
 }
?>

კოდი დაბეჭდავს მსგავსს:

Error: [512] Value must be 1 or below
Webmaster has been notified

და ელ-ფოსტაზე მიიღება მსგავსი:

Error: [512] Value must be 1 or below

ეს არ გამოიყენება ყველა შეცდომაზე. რეგულარული შეცდომები აღირიცხება სერვერზე, PHP სტანდარტული აღრიცხვის სისტემის გამოყენებით.