Ayant des problèmes pour insérer et mettre à jour des tables dans une base de données avec des instructions préparées
Question
Très nouveau sur PHP5 et j'ai encore quelques problèmes. J'ai compris comment sélectionner avec les instructions préparées maintenant essayer d'insérer / mettre à jour mon code est la suivante
function input_lab_results($name, $image, $descrip) {
$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, ?, ?, ?, ?)";
if($stmt = $this->conn->prepare($query)){
$stmt->bind_param('sssiidd', $name, $image, $descrip, 0, 0, date("Ymd"), date("Ymd"));
$stmt->execute();
die();
} else{
die($this->conn->error);
}
}
L'erreur que je reçois est
Erreur fatale: impossible de transmettre le paramètre 4 par référence html / classes / mySQL.php à la ligne 43
Toute aide / référence serait appréciée. Merci.
Tout le monde mentionne l'utilisation de PDO, avez-vous des bons tutoriels ou des exemples de cela s'il vous plaît?
La solution 2
Je l'ai changé en
function input_lab_results($name, $image, $descrip) {
$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, 0, 0, ?, ?)";
if($stmt = $this->conn->prepare($query)){
$stmt->bind_param('sssdd', $name, $image, $descrip, date("Ymd"), date("Ymd"));
$stmt->execute();
die();
} else{
die($this->conn->error);
}
}
Fondamentalement, j'ai changé où il lisait le ?? pour l'entier à 0 dans la requête, je ne l'ai pas lié.
Autres conseils
ce n'est pas $ descrip
qui est le problème; ce sont les 0 (paramètres 4 et 5). la solution consiste à passer des variables plutôt que des entiers:
`$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, ?, ?, ?, ?)";`
$pat_doctor = 0;
$pat_resident = 0;
if($stmt = $this->conn->prepare($query)){
$stmt->bind_param('sssiidd', $name, $image, $descrip, $pat_doctor, $pat_resident, date("Ymd"), date("Ymd"));`
évidemment, mysqli_bind_param veut que ses arguments soient des références afin de rechercher où ils sont stockés en mémoire plutôt que de copier leurs valeurs. cela est logique car certaines des choses que vous souhaitez lier à l'instruction SQL, telles que cette image, sont probablement suffisamment grandes pour que vous préfériez ne pas avoir trop de copies. les littéraux, chaîne ou autre, ne sont pas accessibles par référence. voir: http://us.php.net/references
Je ne suggère pas de coder en dur les 0 dans l'instruction SQL, car cela confond inutilement votre code.
permettez-moi de suggérer le PDO, au fait. sa syntaxe est beaucoup plus saine.
N'utilisez pas bind_param
- Il s'agit d'une interface peu intuitive et sujette aux erreurs, qui est principalement un héritage de la C-api sous-jacente. Utilisez bind_value
ou, mieux encore - pass un tableau de valeurs en tant qu'argument pour PDOStatement- > execute
. Par exemple:
$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, 0, 0, ?, ?)";
if ($stmt = $this->conn->prepare($query)) {
$stmt->execute(array($name, $image, $descrip, date("Ymd"), date("Ymd")));
die();
} else {
die($this->conn->error);
}