Witam!
Mam kilka pytań odnośnie połączeń z bazą danych poprzez PDO:
1. Obsługa błędów
Błędy sprawdzam poprzez try catch, w bloku try umieszczam wszystkie instrukcje do połączenia z bazą. tylko co w sytuacji gdy w tym bloku znajdzie się inna funkcja która rzuca wyjątek ? Dodaję nowy argument w catch i jak chce sprawdzić która funkcja rzuciła wyjątek to jeden z argumentów będzie NULL ?
2. Zabezpieczenie przed SQLInjection
Przed wysłaniem zmiennej do bazy muszę ją zabezpieczyć poprzez htmlentities($from_get, ENT_QUOTES, "UTF-8"); oraz samo zapytanie $sql_query = sprintf("SELECT * FROM USER WHERE zmienna='%s'", mysqli_real_escape_string($db_connect, $from_get)); Tak robiłem nie korzystając z PDO. Używając PDO też muszę tak zabezpieczać zmienne ? Czy każdą zmienna muszę tak zabezpieczać oraz każde zapytanie nawet gdy nie pochodzi ona z GET CZY POST ? Nawet jeżeli skrypt tylko wyświetla dane z bazy ( nie pobiera żadnych danych z POST z GET ) ? Jeżeli mam zmienna zapisaną w cookies i na podstawie tej zmiennej chcę coś wyświetlić z bazy to też muszę tak robić ?
Zabezpieczać zmienne poprzez htmlentities($from_get, ENT_QUOTES, "UTF-8"); muszę zaraz przed zapytaniem ? Jeżeli wykonam tę funkcję na zmiennej:
$zmienna = 4;
$zmienna_druga = "to jest tekst";
$zmienna = htmlentities($zmienna, ENT_QUOTES, "UTF-8");
$zmienna_druga = htmlentities($zmienna_druga, ENT_QUOTES, "UTF-8");
To czy $zmienna jest równa 4 a $zmienna_druga jest równa "to jest jakiś tekst" i mogę to porównać zwykłym if'em ?
try
{
$db_connect = new PDO('mysql:host=localhost;dbname=NAME;charset=utf8', 'usr', 'pass', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$from_get = $_GET['zmienna1'];
$from_get = htmlentities($from_get, ENT_QUOTES, "UTF-8");
$sql_query = sprintf("SELECT * FROM USER WHERE zmienna='%s'", mysqli_real_escape_string($db_connect, $from_get));
$stmt = $db_connect->query($sql_query);
}
catch(PDOException $e)
{
$db_connect.close();
//echo $e;
header("Location: index.php");
die();
}