Otsi Vahvlist
Kuvatakse tulemused sildile ''pdo''.
Leitud 2 tulemust
-
Teen siin login enda ühele tööle, aga kuskil olen teinud vea mida ma ei leia üles, et kus kuradimas see viga on. Error ta ei kuva ning ei logi sisse ka. $username = $_POST['username']; $password = $_POST['password']; $sql = $bd -> prepare("SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . md5($password) . "'"); $sql -> execute(); if($sql -> rowCount()){ session_start(); $_SESSION['logged_in'] = true; $_SESSION['username'] = $username; } else { echo 'Wrong username / or password'; } } if(isset($_SESSION['logged_in']) && isset($_SESSION['username'])){ header("Location: members.php"); } ?>
-
Kahjuks paljud inimesed vaatavad W3Schools õpetusi ja üldiselt vanasi õpetusi mis ei ole enam tänapäevased ja võivad teha lehele rohkem kahju kui kasu. Rääkimata sellest, et see on sulle endale raskem kui kasutada uuemaid viise. Üks kõige tähtsamaid osasi PHPs on andmebaasiga ühendus, samuti on see üks kõige halvemini õpetatud osa kus paljud ise õppinud inimesed teevad vigu ja kasutavad aegunud meetodeid. Nagu näiteks nii: mysql_connect('localhost', 'username', 'password') or die('Ei saanud ühendust: ' . mysql_error()); mysql_select_db('mingidb') or die('Ei saanud valida andmebaasi.'); $query = "SELECT * from mingitabel"; $result = mysql_query($query) or die('Päring ebaõnnestus: ' . mysql_error()); while ($row = mysql_fetch_object($result)) { echo $row->nimi; } See on vana, sa ei saa vahetada andmebaasi mootoreid ja see on väga haavatav kui sa ei kontrolli põhjalikult kasutaja sisestusi. Mida selle asemel kasutada? PDO ehk PHP Data Objects. See toetab enamusi andmebaasi tüüpe ja ta pakub võimalust kasutada ettevalmistatud päringuid mis hoiab ära SQL injection rünnakud. Kuidas luua ühendust? Kui sa enne kasutasid: mysql_connect('localhost', 'username', 'password') or die('Ei saanud ühendust: ' . mysql_error()); Siis nüüd kasutad sa: $conn = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password); See algne string ei ole midagi rasket, me ütleme mis andmebaasi me kasutame(mysql:), ja kuidas sinna ühenduda.(host=localhost;dbname=mingidb). Järgnevad kasutajanimi ja parool. Kui me peaksime kunagi tahtma muuta oma andmebaasi mootorit siis piisab ainult 'mysql' muutmisest millegiks muuks. ('sqlite') Vigade püüdmine try { $conn = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { echo 'ERROR: ' . $e->getMessage(); } Vea tekkimisel ta nüüd teatab sellest. Algselt on see PDO::ERRMODE_SILENT, millega ta ei näita ühtegi viga ühendumisel. Siis piisab vigade näitamiseks sellest: echo $conn->errorCode(); echo $conn->errorInfo(); Andmete saamine Esimene viis: Query $name = 'Henry'; try { $conn = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $data = $conn->query('SELECT * FROM mingitabel WHERE name = ' . $conn->quote($name)); foreach($data as $row) { print_r($row); } } catch(PDOException $e) { echo 'ERROR: ' . $e->getMessage(); } Nagu te näete siis siin peab veel ise kasutajapoolse sisestuse puhastama kasutades PDO::quote mis on võrdväärne mysql_real_escape_string funktsiooniga. Seda viisi on soovitatav kasutada siis kui sa ei lisa päringule kasutaja sisestust. Teine viis: Ettevalmistatud päringud $id = 5;try { $conn = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $conn->prepare('SELECT * FROM mingitabel WHERE id = :id'); $stmt->execute(array('id' => $id)); while($row = $stmt->fetch()) { print_r($row); } } catch(PDOException $e) { echo 'ERROR: ' . $e->getMessage(); } Me kasutame PDO::prepare meetodit, et valmistada päring ette. See hoiab ära igasuguse SQL rünnaku kuna me ei lisa andmeid otse päringusse. Andmete lisamiseks kasutame kohahoidjat ":id", on lubatud ka "?" kui siis on hiljem raske saada aru mis asi on kus. Hiljem päringu täitmisel me lisame juurde selle kohahoidja väärtuse: $stmt->execute(array('id' => $id)); Lubatud on ka: $stmt->bindParam(':id', $id, PDO::PARAM_INT);$stmt->execute(); See annab paremat kontrolli andmete üle ja hoiab SQL rünnakud veel kaugemal kontrollides väärtuse tüüpi. Tulemusi on võimalik saada tagasi mitmel viisil: while($row = $stmt->fetch(PDO::FETCH_OBJ)) { print_r($row); } PDO::FETCH_ASSOC tagastab massiivi. PDO::FETCH_BOTH tagastab massiivi nii tulba nimega kui ka indeksiga. PDO::FETCH_OBJ tagastab objekti mille väärtuste nimed ja väärtused on vastavad tulpadele. PDO::FETCH_CLASS tagastab uue klassi Kuidas saada teada kas päring tagastas tulemusi? if ( count($result) ) { foreach($result as $row) { print_r($row); } } else { echo "Ei ole tulemusi."; } Mitu päringut try { $conn = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $conn->prepare('INSERT INTO mingitabel VALUES(:name)'); $stmt->bindParam(':name', $name); $name = 'Henry'; $stmt->execute(); $name = 'Sander'; $stmt->execute(); } catch(PDOException $e) { echo $e->getMessage(); } Kui päring on ettevalmistatud võib seda kasutada mitu korda muutes eri väärtusi. CRUD - Create-Update-Delete Create - Insert try { $pdo = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('INSERT INTO mingitabel VALUES(:name)'); $stmt->execute(array( ':name' => 'Justin Bieber' )); echo $stmt->rowCount(); // tagastab 1 } catch(PDOException $e) { echo 'Viga: ' . $e->getMessage(); } Update $id = 5;$name = "Henry"; try { $pdo = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('UPDATE mingitabel SET name = :name WHERE id = :id'); $stmt->execute(array( ':id' => $id, ':name' => $name )); echo $stmt->rowCount(); // 1 } catch(PDOException $e) { echo 'Viga: ' . $e->getMessage(); } Delete $id = 5; try { $pdo = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('DELETE FROM mingitabel WHERE id = :id'); $stmt->bindParam(':id', $id); $stmt->execute(); echo $stmt->rowCount(); // 1 } catch(PDOException $e) { echo 'Viga: ' . $e->getMessage(); } Klassid ja Objektid class Kasutaja { public $eesnimi; public $perekonnanimi; public function nimi() { return $this->eesnimi . ' ' . $this->perekonnanimi; } } try { $pdo = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $result = $pdo->query('SELECT * FROM mingitabel'); $result->setFetchMode(PDO::FETCH_CLASS, 'Kasutaja'); while($user = $result->fetch()) { echo $user->nimi(); } } catch(PDOException $e) { echo 'Viga: ' . $e->getMessage(); } Loodetavasti need kes siiani kasutasid aegunud viise muudavad ennast ja mõistavad kui palju parem on kasutada PDOd ja näevad milliseid uusi võimalusi see pakub. Vabandused kui millegist ei saa aru, eesti keelest inglise keelde tõlkimine on raske kui oled harjunud koodima inglise keeles ja kasutama väljendeid inglise keeles. Õpetuse tegin selle õpetuse baasil. Henry, Vahvel.Net
-
- andmebaasiga
- pdo
-
(ja 2 veel)
Sildistatud koos: