web-dev-qa-db-fra.com

PDP bindParam () avec l'instruction préparée ne fonctionne pas

Ok, c'est le problème:

Cela marche:

$STH = $DBH->prepare("SELECT * FROM juegos WHERE id = 1");
$STH->execute();

Cela ne veut pas:

$STH = $DBH->prepare("SELECT * FROM juegos WHERE id = :id");
$STH->bindParam(':id', '1', PDO::PARAM_STR);
$STH->execute();

Qu'est-ce que je fais mal au monde? Il ne jette même pas une exception

Merci tout le monde!

En outre, c'est tout le code

<?php
    try {
        $DBH = new PDO("everything is", "ok", "here");

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

        $STH = $DBH->prepare("SELECT * FROM juegos WHERE id = :id");
        $STH->bindParam(':id', '1', PDO::PARAM_STR);
        $STH->execute();

        $STH->setFetchMode(PDO::FETCH_ASSOC);

        while($row = $STH->fetch()) {
            echo $row['nombre']."<br/>";
        }

        $DBH = null;

        echo "Todo salió bien";

    } catch (PDOException $e) {
        echo "Error";
    }

?>
12
arielnmz

En utilisant bindParam(), la variable est liée en tant que référence .

Une chaîne ne peut pas être passée par référence .

Les choses suivantes peuvent être passées par référence:

Variables, c'est-à-dire foo ($ a)

Nouvelles déclarations, par exemple foo (new foobar ())

Références renvoyées par des fonctions

Essayez d’utiliser bindValue()

$STH->bindValue(':id', '1', PDO::PARAM_STR);
16
david strachan

PHP BinParam() Lie une variable PHP à un espace réservé correspondant nommé ou un point d'interrogation dans l'instruction SQL utilisée pour la préparer.

La manière correcte d'utiliser bindParam est la suivante:

$id = 1;
$sth = $DBH->prepare("SELECT * FROM juegos WHERE id = :id");
$sth->bindParam(':id', $id, PDO::PARAM_INT);// use bindParam to bind the variable

:id //represents the variable
$id //is the variable being represented by ':id',
PDO::PARAM_INT //states that the value of the variable $id should be a string

PHP BindValue() Lie une valeur à un espace réservé correspondant nommé ou un point d'interrogation dans l'instruction SQL utilisée pour préparer l'instruction.

$id=10;
$name=roadkill;
$sth = $dbh->prepare('SELECT *
    FROM juegos
    WHERE id < :id AND name = :name');
$sth->bindValue(':id', $id, PDO::PARAM_INT);// use bindValue to bind the variable's value
$sth->bindValue(':name', $name, PDO::PARAM_STR);// use bindValue to bind the variable's value

La principale différence entre ces deux méthodes est que, contrairement à PDOStatement::bindValue(), avec bindParam(), la variable est liée en tant que référence et ne sera évaluée qu'au moment de l'appel de PDOStatement::execute().

2
Cristo Rutazihana

La valeur du paramètre :tabla sera automatiquement citée et échappée par PDO. La requête exécutée deviendrait:

SELECT * FROM 'juegos'

qui n'est pas valide SQL.

2
hackedd

ne transmettez pas la valeur directement à BindParam.

try {
       // $DBH = new PDO("everything is", "ok", "here");
        $DBH = new PDO("mysql:Host=localhost;dbname=test", 'root', '');
        $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        $STH = $DBH->prepare("SELECT * FROM statstracker WHERE SrNo = :id");
        $id = 1; // here you should keep it as variable and pass it to param
        $STH->bindParam(':id', $id, PDO::PARAM_STR);
        $STH->execute();

        $STH->setFetchMode(PDO::FETCH_ASSOC);

        while($row = $STH->fetch()) {
            echo $row['SrNo']."<br/>";
        }

        $DBH = null;

        echo "Todo salió bien";

    } catch (PDOException $e) {
        echo "Error";
    }
0
SAR