Avatar billede Smitche Praktikant
03. januar 2013 - 18:15 Der er 10 kommentarer og
1 løsning

Forskellen på PDOStatement::bindParam() og PDOStatement::bindValue () og hvorfor binde sine parametre?

Jeg fandt denne tråd med samme spørgsmål:
http://stackoverflow.com/questions/1179874/pdo-bindparam-versus-bindvalue

Men er stadig ikke helt sikker på jeg forstår hvornår man bruger hvad. Når jeg kigger på dokumenteringen på php.net så kan jeg ikke helt forstå forkellen andet end et '12'-tal (og hvad det så gør)?

Derudover er jeg ikke helt sikker på hvorfor det er godt binde sine parametre - hvad er det sker med ved hjælp af dette?

Læste dette på en anden tråd her på siden "at binde dine parametre, bl.a. for at sikre, at argumenterne har den ønskede type." - men hvad betyder det?

Håber nogen kan forklare mig dette.

bindParam:
<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

bindValue:
<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindValue(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', $colour, PDO::PARAM_STR);
$sth->execute();
?>


Jeg spørger da jeg gerne vil bruge PDO prepared statements for at sikre mod SQL-injections. Så er denne metode korrekt for at gøre dette? (Se nedenstående)

require_once('connect.inc.php');
$conn = dbConnect('pdo');

//ID
$newsidfk    = $_GET['news_id_fk'];
$commentsidfk     = $_GET['comments_id_fk'];
$username    = $_GET['username'];

if(!empty($_GET['username']))
{
    // PDO prepared statement og binding
    $stmt = $conn->prepare("DELETE FROM users_tbl WHERE  users_tbl.username =:username");
    $stmt->bindParam(':username', $username, PDO::PARAM_STR);
    $stmt->execute();

    header("location:prefs.php");
}

På forhånd tak
Avatar billede arne_v Ekspert
03. januar 2013 - 18:30 #1
Forskellen kan forklares som:

$username = 'A';
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$username = 'B';
$stmt->execute();

sletter bruger B mens:

$username = 'A';
$stmt->bindValue(':username', $username, PDO::PARAM_STR);
$username = 'B';
$stmt->execute();

sletter bruger A.
Avatar billede arne_v Ekspert
03. januar 2013 - 18:31 #2
bindParam bruger variablens vaerdi ved execute - bindValue bruger variablens vaerdi ved bindValue
Avatar billede arne_v Ekspert
03. januar 2013 - 18:34 #3
og med hensyn til de 12

$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);

betyder brug vaerdien af $color ved execute, den skal bruges som streng og den maa max. vaere 12 lang

$sth->bindValue(':colour', $colour, PDO::PARAM_STR);

betyder brug vaerdien af $color her og nu, den skal bruges som streng og det giver ikke nogen mening at putte en restriktion paa laengden - hvis der skal testes saa goer man det bare paa dette sted i koden
Avatar billede Smitche Praktikant
03. januar 2013 - 19:23 #4
Mange tak for dine svar. Men er dog ikke helt sikker på hvorfor man skulle bruge den ene frem for anden - og hvorfor man overhovedet bind'er?
Avatar billede arne_v Ekspert
03. januar 2013 - 19:27 #5
Jeg ville bruge bindValue hvis jeg havde vaerdien paa det tidspunkt.

Jeg ville bruge bindParam hvis jeg ikke havde vaerdien paa det tidspunkt, fordi den blev fundet senere eller fordi der skal bruges flere forskellige vaerdier.
Avatar billede arne_v Ekspert
03. januar 2013 - 19:36 #6
Du skal bruge prepared statements for at forhindre SQL injection og i nogen tilfaelde for at faa bedre performance.

Du har saa valget mellem at angive parameterne i execute eller at binde dem.

Jeg mener at det foerste svarer til at bind values med type string.

Det andet giver mere kontrol:
* du kan angive forskellige typer
* du kan klare out parametre i stored procedures
og sikkert en del mere som jeg ikke kender til
Avatar billede Smitche Praktikant
03. januar 2013 - 20:24 #7
Okay men hvad er det bind'ing gør?
Avatar billede arne_v Ekspert
03. januar 2013 - 20:45 #8
Erstatter placeholder i SQL med det rigtige.
Avatar billede Smitche Praktikant
04. januar 2013 - 12:38 #9
Mange tak for dine svar. Har nu fået min aha-oplevelse. :)
Avatar billede Smitche Praktikant
04. januar 2013 - 12:38 #10
Læg et svar, så kan du få pointene.
Avatar billede arne_v Ekspert
04. januar 2013 - 15:24 #11
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester