Hva er riktig PDO?

kongen

kongemedlem
Hva er riktigst PDO av disse?

PHP:
$datamaskin = $_GET['datamaskin']; // Lenovo  // Acer

function hentData($database) {
   $stmt = $database->query("SELECT fornavn, alder FROM tabell WHERE datamaskin=?");
   $stmt->execute(array($datamaskin));
   return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

try {
   $data = hentData($database);
} catch(PDOException $ex) {
   echo "Syntax error"
}

if (empty($data)){
header('Location: datamaskin.php');
exit();
}

echo $data['fornavn'].' er '.$data['alder'].' år og har '.$datamaskin; 

// Pål er 18 år og har Lenovo
// Per er 20 år og har Acer

PHP:
$datamaskin = $_GET['datamaskin']; // Lenovo // Acer

$stmt = $database->query("SELECT fornavn, alder FROM tabell WHERE datamaskin=?");
$stmt->execute(array($datamaskin));
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);

if (empty($data)){
header('Location: datamaskin.php');
exit();
}

echo $data['fornavn'].' er '.$data['alder'].' år og har '.$datamaskin; 

// Pål er 18 år og har Lenovo
// Per er 20 år og har Acer

Hva er egentlig vitsen med slik try/catch-greier som den første har? Er det ikke enklere å bare kutte det ut slik som den siste?
 

adeneo

Medlem
Generelt bør man unngå try/catch, men det brukes ofte med PDO nettopp for å fange opp feil og vise feilmeldinger.

Funksjonen hentData() vil generelt sett alltid returnere ett av følgende ;
  • gyldig resultat
  • et tomt array dersom det ikke er noe resultat å returnere
  • "false" dersom noe går feil

...slik at dersom man ikke trenger å fange opp den spesifikke feilen så trenger man heller ikke try/catch.

PS: PDOException krever enkelte settinger, i dette tilfellet

PHP:
$database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Det er også verdt å merke seg at dersom antall variabler som brukes i en prepared statement er dynamisk, og det kan være avvik som vil føre til feil, for eksempel at man har 4 spørsmålstegn i SQL'en, og bruker et array med bare 2 verdier, så vil PDOException også fange opp den feilen, og gi en fornuftig feilmelding.
 

kongen

kongemedlem
Takk for svar :)

Jeg har disse settingene:

PHP:
$database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$database->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

samt utf8 inne i new PDO parentesen der hvor db brukernavn/passord er.

Kan jeg bare slette den øverste av settingene hvis jeg ikke skal bruke try/catch og errorting? Hva med den siste settingen, hva er den godt for? Jeg bare kopierte noe jeg fant på nettet fra noen guider og har ikke peiling på hva det er. Men det virker...
 

adeneo

Medlem
Dersom du ikke bruker PDOException så kan du slette den første linjen, ettersom den settingen kun slår på feilmeldinger.

Den andre linjen kommer an på hvilken database som benyttes, PHP dokumentasjonen sier
PDO::ATTR_EMULATE_PREPARES
Enables or disables emulation of prepared statements. Some drivers do not support native prepared statements or have limited support for them. Use this setting to force PDO to either always emulate prepared statements (if TRUE), or to try to use native prepared statements (if FALSE). It will always fall back to emulating the prepared statement if the driver cannot successfully prepare the current query.

Dersom du bruker MySQL, så støtter versjon 5.1.21 og høyere, prepared statements direkte i databasen, og således trenger man ikke emulere prepared statements i PDO, og den kan settes til "false".

Dersom MySQL versjonen er gamlere enn 5.1.21 bør EMULATE_PREPARES være aktivert.
 
Topp