2 votes

Appel d'une procédure stockée mysql avec un paramètre en PHP

J'appelle une procédure stockée mysql avec deux paramètres d'entrée. Voici le code que j'ai :

if (isset($_POST['button1'])) {
    $con = mysql_connect("localhost:3306","root","");
    if (!$con) {     
        echo '<b>Could not connect.</b>';
        die(mysql_error()); // TODO: better error handling
    } else {          
        mysql_select_db("php_database_1", $con);

        $username_v = $_POST['username'];
        $password_v = $_POST['password'];

        $stmt = $dbh->prepare("CALL login(?, ?)");
        $stmt->bindParam(2, $username_v, $password_v, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 

        // call the stored procedure
        $stmt->execute();

        print "procedure returned $username_v\n";

En exécutant, j'obtiens :

Avis : Variable indéfinie : dbh dans E:\xampp\htdocs\php4\default.php sur la ligne 52 Erreur fatale : Appel à une fonction membre prepare() sur un non-objet dans E:\xampp\htdocs\php4\default.php sur la ligne 52

Comment puis-je réparer cela ?

Merci.

7voto

Michael Berkowski Points 137903

Modifié : Après avoir vu plus de code, vous avez essayé de mélanger le mysql_() fonctions avec PDO. Vous ne pouvez pas faire cela -- à la place, utilisez uniquement PDO. Les deux API ne fonctionnent pas ensemble, et l'ancienne version de mysql_*() L'API ne prend pas du tout en charge les déclarations préparées.

Vous ne vous êtes pas connecté à votre base de données ou n'avez pas instancié un objet PDO.

$username_v = $_POST['username'];
$password_v = $_POST['password'];
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';

// You must first connect to the database by instantiating a PDO object
try {
    $dbh = new PDO($dsn, 'root', 'root_db_pw');
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

// Then you can prepare a statement and execute it.    
$stmt = $dbh->prepare("CALL login(?, ?)");
// One bindParam() call per parameter
$stmt->bindParam(1, $username_v, PDO::PARAM_STR); 
$stmt->bindParam(2, $password_v, PDO::PARAM_STR); 

// call the stored procedure
$stmt->execute();

0voto

Ayant essayé la solution de Michaels pour une autre tâche et échoué lamentablement avec la procédure CALL disant qu'elle attendait 0 paramètre et en a obtenu 2, je vais juste laisser cette solution de contournement pour les autres qui ont les mêmes problèmes :

$username_v = $_POST['username'];
$password_v = $_POST['password'];
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';

// You must first connect to the database by instantiating a PDO object
try {
    $dbh = new PDO($dsn, 'root', 'root_db_pw');
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

// Then you can prepare a statement and execute it.    
$stmt = $dbh->prepare("SET @username_v = '$username_v'; SET @password_v = '$password_v';  CALL login()");

// call the stored procedure
$stmt->execute();

0voto

Atul Points 64

Si vous voulez appeler une procédure stockée avec un paramètre IN sans PDO, le code ci-dessous peut vous aider.

$stmt = $conn->prepare("CALL dataCreation(?)");
mysqli_stmt_bind_param($stmt, "s", $lastDate);
mysqli_stmt_execute($stmt);

J'espère que cela aidera quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X