2009-11-04 5 views
7

Wie immer sah ich mich um Best Practices mit PHP, und vorbereitete Aussagen scheint die Art von Sachen, die ich jetzt tun sollte, wie mit meinen geschlossenen Augen tun. Also habe ich mit einigen Beispielen angefangen, die ich gefunden habe.Mysqli Prepared Statement in bindParam() funktioniert nicht

Ich habe diesen Fehler bekommt, wenn das Skript ausgeführt wird:

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

Hier den Code geht.

Insert Einfache 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); 
?> 

Nicht sicher, was ich falsch hier tun, hat dieses ähnliches Beispiel bei php.net gefunden ist, Warum funktioniert nicht? PS: Ich denke, die mysqli-Verbindung ist nicht das Problem, weil ich es verwendet habe, um einige vorbereitete Anweisungen mit SELECT SQL-Befehlen zu machen. Und hat ziemlich gut funktioniert.


EDIT

Die Auflösung und warum.

Nun in der example ich sollte bind_param() für jeden Wert in der Abfrage verwenden. Aber dank Bart konnte er das Problem mit meinem Code lösen.

Wo es:

$stmt->bindParam(1, $nome); 
$stmt->bindParam(2, $telefone); 
$stmt->bindParam(3, $bi); 

es sein sollte:

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

Nun für diejenigen, die sich fragen könnte, was "sii".

Gut bind_param für was ich sehe es bindet die "$ var" an jedes Fragezeichen "?" in Ordnung.

Also mit einem bind_param() kann ich sie alle zur gleichen Zeit binden, und die normale Verwendung von bind_param() erfordert, den Typ der Daten anzugeben, binded.

Mein erster Wert, der gebunden werden soll, ist $nome ein String, der durch das "s" spezifiziert ist;

Und die anderen $telefone und $bi sind Integer für die er "ich" habe;

Für andere, die hier ein ähnliches Problem haben, geht es andere Datentypen (von php.net).

i = Integer;

s = String;

d = Double;

b = Blob;

Wenn jemand eine bessere Erklärung bitte posten Sie es oder kommentieren. So kann ich meine eigenen verbessern.

Danke.

Antwort

6

Sie mögen denken, es ist nichts falsch mit der Verbindung, aber Sie sollten überprüfen, um sicherzustellen:

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

EDIT:

Was passiert, wenn Sie tun:

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

?

Ist die Tabelle coisas richtig geschrieben?

+0

Guter Vorschlag für Best Practice. Ich habe versucht, aber es hat das Problem nicht gelöst. Irgendeine andere Idee? –

+0

$ stmt-> bind_param ("sii", $ nome, $ telefon, $ bi); Hat funktioniert. –

+0

Gut zu hören Fábio. –

2

Machen Sie eine Print_r auf $ stmt, nachdem Sie es wieder in Zeile 4 bekommen. Ist es ein echtes Objekt? Ich vermute nein.

+0

Nicht sicher, was das aber tun wird. Das Problem war, dass ich Bind-Parameter für jeden Wert verwende, ich konnte nur einen verwenden, und ich erwähnte den Wert-Eingabetyp nicht (s = String | i = Integer). Danke trotzdem. –

+0

Der Fehler zeigte an, dass das Objekt ($ stmt), für das Sie eine Methode aufgerufen haben, kein Objekt war. Das hätte innerhalb dieser Methode passieren können, aber meine erste Vermutung war, dass es in erster Linie ein Nullwert war. – Zak