Proprio come al solito guardavo intorno alle best practice con PHP, e le dichiarazioni preparate sembrano il tipo di cose che dovrei fare ora come fare con gli occhi chiusi. Così ho iniziato a giocare con alcuni esempi che ho trovato.Istruzione preparata da Mysqli in bindParam() non funzionante
ho questo errore durante l'esecuzione dello script:
Fatal error: Call to a member function bindParam() on a non-object in /opt/lampp/htdocs/phpSecurity/PreparedStatments/Insert-Multi-Binded-Params/Insert Simple Method.php on line 10
Qui va il codice.
Inserire semplice Method.php
<?php
require_once '../config.php';
$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)");
$nome = 'Fabio Antunes';
$telefone = 916810641;
$bi = 123093456;
$stmt->bindParam(1, $nome);
$stmt->bindParam(2, $telefone);
$stmt->bindParam(3, $bi);
$stmt->execute();
$stmt->close();
$db->close();
?>
config.php
<?php
$server_host = 'localhost';
$server_user = 'root';
$server_password = '';
$server_db = 'PreparedStatements';
$db = new mysqli($server_host, $server_user, $server_password, $server_db);
?>
Non sei sicuro di quello che sto facendo male qui, questa è esempio simile trovato alla php.net, perché non funziona? PS: Penso che la connessione mysqli non sia il problema perché l'ho usata per fare alcune istruzioni preparate con comandi SELECT SQL. E ha funzionato abbastanza bene.
EDIT
La risoluzione e perché.
Bene nel example dovrei usare bind_param()
per ogni valore nella query. Ma grazie a Bart, è riuscito a risolvere il problema con il mio codice.
Dove si trova:
$stmt->bindParam(1, $nome);
$stmt->bindParam(2, $telefone);
$stmt->bindParam(3, $bi);
dovrebbe essere:
$stmt->bind_param("sii", $nome, $telefone, $bi);
Ora per coloro che potrebbero chiedersi che cosa è "sii".
Bene bind_param per quello che vedo lega "$ var" a ogni punto interrogativo "?" In ordine.
Quindi con uno bind_param()
è possibile collegarli tutti allo stesso tempo e l'utilizzo normale di bind_param()
richiede di specificare il tipo di dati da associare.
Il mio primo valore da associare è $nome
una stringa, specificata dalla "s";
E gli altri $telefone
e $bi
sono interi per quello che ha "i";
Per altri che hanno un problema simile qui vanno altri tipi di dati (da php.net).
i = Integer;
s = String;
d = Double;
b = Blob;
Se qualcuno come spiegazione migliore si prega di postarlo o commentare. Quindi posso migliorare il mio.
Grazie.
Buon suggerimento per le migliori pratiche. Ho provato ma non ha risolto il problema. Qualche altra idea? –
$ stmt-> bind_param ("sii", $ nome, $ telefone, $ bi); Lavorato. –
Buono a sentirlo Fábio. –