2009-11-04 12 views
7

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.

risposta

6

Si può pensare che ci sia niente di sbagliato con la connessione, ma si dovrebbe verificare che:

$db = new mysqli($server_host, $server_user, $server_password, $server_db); 
if (mysqli_connect_errno()) { 
    printf("DB error: %s", mysqli_connect_error()); 
    exit(); 
} 

EDIT:

Cosa succede quando si esegue:

$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)"); 
$stmt->bind_param("sii", $nome, $telefone, $bi); 
$stmt->execute(); 

?

La tabella coisas ha digitato correttamente?

+0

Buon suggerimento per le migliori pratiche. Ho provato ma non ha risolto il problema. Qualche altra idea? –

+0

$ stmt-> bind_param ("sii", $ nome, $ telefone, $ bi); Lavorato. –

+0

Buono a sentirlo Fábio. –

2

fare un print_r su $ stmt dopo averlo riavviato sulla linea 4. È un oggetto reale? Sto indovinando no.

+0

Non so cosa farà ma. Il problema era che io come usare il parametro bind per ogni valore, potevo usare solo uno, e non ho menzionato il valore del tipo di input (s = string | i = intero). Grazie comunque. –

+0

L'errore indicava che l'oggetto ($ stmt) a cui si stava chiamando un metodo non era in effetti un oggetto. Ciò avrebbe potuto esserci all'interno di quel metodo, ma la mia prima ipotesi era che si trattava di null $ stmt in primo luogo. – Zak

Problemi correlati