Ayant des problèmes pour insérer et mettre à jour des tables dans une base de données avec des instructions préparées

StackOverflow https://stackoverflow.com/questions/652960

  •  19-08-2019
  •  | 
  •  

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?

Était-ce utile?

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top