• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Operator kontroli błędów nie działa

VPS Starter Arubacloud
+1 głos
449 wizyt
pytanie zadane 11 czerwca 2022 w PHP przez Code Nowicjusz (200 p.)

Dzień dobry,

podczas robienia kursu Pasja informatyki odcinek 2 PHP zauważyłem, iż operator kontroli błędów nie działa. Wstawiam moje kody na podstawie tych z odcinka:

<!DOCTYPE HTML>
<html lang="pl">
<head>
	<meta charset="utf-8"/>
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
	<title>Osadnicy - gra przeglądarkowa</title>
</head>
<body>

	Tylko martwi ujrzeli koniec wojny - Platon<br/><br/>
	
	<form action="zaloguj.php" method="post">
		Login: </br> <input type="text" name="login"/> </br>
		Hasło: </br> <input type="password" name="haslo"/> </br></br>
		<input type="submit" value="Zaloguj się"/>
	</form>

</body>
</html>
<?php
	$host = "localhost";
	$db_user = "root";
	$db_password = "konstantynopolitanczykowna";
	$db_name = "osadnicy";
?>
<?php

	require_once "connect.php";
	
	$p = @new mysqli($host, $db_user, $db_password, $db_name);
	
	if($p->connect_errno!=0)
	{
		echo "Error: ".$p->connect_errno."Opis: ".$p->connect_error;
	}
	else
	{
		$login = $_POST["login"];
		$haslo = $_POST["haslo"];
		
		echo "It works";
		
		$p->close();
	}

?>

Gdy w xampie nie ma ustawionego hasła, natomiast w pliku connect.php poda się hasło, to pomimo operatora kontroli błędów efekt jest taki:

Fatal error: Uncaught mysqli_sql_exception: Access denied for user 'root'@'localhost' (using password: YES) in C:\xampp\htdocs\osadnicy\zaloguj.php:5 Stack trace: #0 C:\xampp\htdocs\osadnicy\zaloguj.php(5): mysqli->__construct('localhost', 'root', 'konstantynopoli...', 'osadnicy') #1 {main} thrown in C:\xampp\htdocs\osadnicy\zaloguj.php on line 5

Gdy nie podaje się hasła w pliku connect.php, strona działa poprawnie. Wydaje mi się że operator ten jakoś nie działa, ale nie wiem dlaczego.

komentarz 11 czerwca 2022 przez VBService Ekspert (251,210 p.)
komentarz 12 czerwca 2022 przez Code Nowicjusz (200 p.)
Ok, spróbuję. Dziękuję za radę.
komentarz 22 marca 2023 przez wikaob Nowicjusz (100 p.)
Jak rozwiązałeś ten problem? Męczę się teraz z tym samym, a nie za bardzo wiem jak użyć tej metody "try catch" ;/
1
komentarz 22 marca 2023 przez VBService Ekspert (251,210 p.)

Pokaż, proszę, ten "kawałek" kodu, w którym masz problem z użyciem try...catch

komentarz 23 marca 2023 przez wikaob Nowicjusz (100 p.)
Dosłownie wszystko tak samo jak w głównym poście, robię z tego samego kursu
komentarz 24 marca 2023 przez VBService Ekspert (251,210 p.)

@wikaob, Proponuję użyć PDO [ 1 ]  [ 2 ], za jego pomocą można połączyć z każdą bazą danych z poziomu php.

Przykład z użyciem  try...catch

try {
  // połączenie z bazą danych
  $conn = new PDO("mysql:host=localhost;dbname=nazwa_bazy", "nazwa_uzytkownika", "haslo");

  // ustawienie wyjątku, jeśli coś pójdzie nie tak
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // przygotowanie zapytania
  $stmt = $conn->prepare("INSERT INTO tabela (kolumna1, kolumna2, kolumna3) VALUES (:wartosc1, :wartosc2, :wartosc3)");

  // podstawienie wartości do znaczników
  $stmt->bindValue(':wartosc1', 'wartosc1');
  $stmt->bindValue(':wartosc2', 'wartosc2');
  $stmt->bindValue(':wartosc3', 'wartosc3');

  // wykonanie zapytania
  $stmt->execute();
} catch(PDOException $e) {
  // wyświetlenie błędu, jeśli coś pójdzie nie tak
  echo "Błąd: " . $e->getMessage();
}

lub

try {
  // połączenie z bazą danych
  $conn = new PDO("mysql:host=localhost;dbname=nazwa_bazy", "nazwa_uzytkownika", "haslo");

  // ustawienie wyjątku, jeśli coś pójdzie nie tak
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // tablica z danymi do wstawienia
  $dane = [
    'kolumna1' => 'wartosc1',
    'kolumna2' => 'wartosc2',
    'kolumna3' => 'wartosc3',
  ];

  // przygotowanie zapytania
  $stmt = $conn->prepare("INSERT INTO tabela (kolumna1, kolumna2, kolumna3) VALUES (:kolumna1, :kolumna2, :kolumna3)");

  // podstawienie wartości z tablicy do znaczników
  $stmt->execute($dane);
} catch(PDOException $e) {
  // wyświetlenie błędu, jeśli coś pójdzie nie tak
  echo "Błąd: " . $e->getMessage();
}

 

komentarz 24 marca 2023 przez wikaob Nowicjusz (100 p.)
edycja 24 marca 2023 przez wikaob
jednak skorzystałam ze sposobu z odpowiedzi na ten post i zainstalowalam xamppa ze starszą wersją. Ale dziękuję i miłego dzionka

2 odpowiedzi

+4 głosów
odpowiedź 11 czerwca 2022 przez wizarddos Nałogowiec (25,130 p.)
wybrane 11 czerwca 2022 przez Code
 
Najlepsza

Czy Twój xampp ma wersję PHP nowszą/równą 8.0.0?

Jeżeli tak to odpowiedź na Twoje pytanie jest w dokumentacji 

Warning

Prior to PHP 8.0.0, it was possible for the @ operator to disable critical errors that will terminate script execution. For example, prepending @ to a call of a function which did not exist, by being unavailable or mistyped, would cause the script to terminate with no indication as to why.

Od PHP 8.0.0 operator @ nie tłumi błędów, które mogą spowodować przedwczesne zakończenie programu

(poza tym, lepiej nie używać @)

komentarz 11 czerwca 2022 przez Code Nowicjusz (200 p.)
Faktycznie. Wersja 8.1. Dziękuję za pomoc.
0 głosów
odpowiedź 28 kwietnia 2023 przez Code Nowicjusz (200 p.)
$condition = 0;
require_once "connect.php";

try
{
	error_reporting(6103 ^ 2);
	$p = new mysqli($host, $db_user, $db_password, $db_name);
}
catch(Exception $z)
{
	$condition = 1;
	echo "Error: ".$z->getCode();
}

Zrobiłem to w ten sposób. Dzięki czemu nie wyświetla się fatal error, gdy w pliku connect.php poda się hasło do logowania do bazy danych, podczas gdy do bazy tej nie ma ustawionego hasła. Przepraszam, że dopiero teraz wstawiam rozwiązanie.

komentarz 29 kwietnia 2023 przez VBService Ekspert (251,210 p.)
edycja 29 kwietnia 2023 przez VBService

Drobna sugestia, dokumentacja php zaleca używania stałych w zapisie

error_reporting(6103 ^ 2);

error_level

 

It takes on either a bitmask, or named constants. Using named constants is strongly encouraged to ensure compatibility for future versions. As error levels are added, the range of integers increases, so older integer-based error levels will not always behave as expected.

 

[ on-line ]  [ Predefined Constants ]

echo E_ALL . PHP_EOL;
echo E_NOTICE . PHP_EOL;
echo E_WARNING . PHP_EOL;
echo E_STRICT . PHP_EOL;
echo (E_NOTICE | E_WARNING) . PHP_EOL;
echo (E_ALL & ~E_NOTICE) . PHP_EOL;
echo (E_ALL & ~(E_STRICT | E_NOTICE));

 

error_reporting() examples

 

// Turn off all error reporting
error_reporting(0);

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);

// Report all PHP errors
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
komentarz 29 kwietnia 2023 przez Code Nowicjusz (200 p.)
Faktycznie, Dziękuję za cenną uwagę.

Podobne pytania

0 głosów
3 odpowiedzi 585 wizyt
0 głosów
3 odpowiedzi 247 wizyt

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...