2 votes

Impossible de passer un paramètre lors de la tentative d'une déclaration préparée

J'essaie d'apprendre les instructions préparées en PHP/MYSQL grâce à de nombreuses suggestions ici. Je continue à obtenir cette erreur :

Fatal error: Cannot pass parameter 2 by reference in C:\xampp\htdocs\blog\admin\create.php on line 57

Quelqu'un peut-il me dire comment résoudre ce problème ? J'ai cherché partout et je n'ai rien trouvé qui puisse m'aider à résoudre ce problème.

Voici mon code :

<?php

require_once '../config.php';

// Check to see if the title was entered from new.php
if ($_POST['title'])
{
$title = $_POST['title'];
} else {

echo "No title was entered. Please go back. <br />";
}

// Check to see if the body was entered from new.php
if ($_POST['body'])
{
$body = $_POST['body'];
} else {

echo "No body was entered. Please go back. <br />";
}

// Get the date
$date = time();

// ID = NULL because of auto-increment
$id = 'NULL';

// If magic_quotes_gpc returns true then it's enabled on the serever and all variables   will be
// automatically escaped with slashes. If it isn't true then it's done manually

if (!get_magic_quotes_gpc())
{
$title = addslashes($title);
$body = addslashes($body);
$date = addslashes($date);
}

// Connect to the database

$db = new mysqli('localhost','username','password','database');

// Check to see if the connection works
if ($db->connect_errno)
{
echo 'Error: Could not connect to database. Please try again.';
exit;
}

// Prepared statement for a query to place something in the database
if(!($stmt = $db->prepare("insert into pages (id, title, body, date) values (?,?,?,?)")))
{
echo "Prepare failed: (" .$db->errno . ")" . $db->error;
}

// THIS IS THE LINE WHERE I'M RECEIVING THE ERROR!!!!!!!!
if (!$stmt->bind_param('isss', ''.$id.'', ''.$title.'',''.$body.'',''.$date.''))
{
echo "Binding parameters failed: (" .$stmt->errno. ")" . $stmt->error;
}

if (!$stmt->execute())
{
echo "Execute failed: (" .$stmt->errno . ") " .$stmt->error;
}

$db->close;

?>

1voto

aefxx Points 10941

Vous devriez jeter un coup d'œil à la page correspondante mysqli_stmt::bind_param documentation. Plus précisément, jetez un coup d'œil à la définition de la fonction :

bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )

Remarquez le mixed &$var1 partie ? Cela signifie essentiellement que vos paramètres sont transmis par référence et non par valeur (ce qui donnerait le résultat suivant mixed $var1 - le & fait la différence).

Maintenant, le problème avec votre invocation est que vous essayez de passer une expression plutôt qu'une variable par référence. De la Documentation PHP :

Les éléments suivants peuvent être transmis par référence :
- Variables, c'est-à-dire foo($a)
- Nouvelles déclarations, c'est-à-dire foo(new foobar())
- Les références renvoyées par les fonctions, [...]

Le remède simple est d'appeler d'abord la liaison avec des variables non initialisées qui sont ensuite affectées à vos données d'entrée traitées, c'est-à-dire

// Prepared statement for a query to place something in the database
$stmt = $db->prepare("insert into pages (id, title, body, date) values (?,?,?,?)");

if ( !$stmt ) {
    echo "Prepare failed: (" .$db->errno . ")" . $db->error;
}

if ( !$stmt->bind_param('isss', $stmt_id, $stmt_title, $stmt_body, $stmt_date) ) {
    echo "Binding parameters failed: (" .$stmt->errno. ")" . $stmt->error;
}

$stmt_id    = (int) $id;
$stmt_title = (string) $title;
$stmt_body  = (string) $body;
$stmt_date  = (string) $date;

if ( !$stmt->execute() ) {
    echo "Execute failed: (" .$stmt->errno . ") " .$stmt->error;
}

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