2009-11-04 17 views
7

Jak zwykle szukałem najlepszych praktyk z PHP, a przygotowane instrukcje wydają się rzeczą, którą powinienem teraz zrobić, jak mam oczy zamknięte. Więc zacząłem grać z kilkoma przykładami, które znalazłem.Mysqli Przygotowane oświadczenie w bindParam() nie działa

Mam ten błąd podczas wykonywania skryptu:

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

Tu idzie kod.

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

Nie wiem co robię źle tutaj, ten jest podobny przykład znaleźć na php.net, dlaczego nie działa? PS: Myślę, że połączenie mysqli nie jest problemem, ponieważ użyłem go do wykonania niektórych przygotowanych instrukcji za pomocą poleceń SELECT SQL. I działało całkiem nieźle.


EDIT

rozdzielczość i dlaczego.

Cóż w example powinienem używać bind_param() dla każdej wartości w zapytaniu. Ale dzięki Bartowi udało mu się rozwiązać problem za pomocą mojego kodu.

Gdzie to jest:

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

Powinno być:

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

Teraz dla tych, którzy mogą się zastanawiać, co jest "sii".

Cóż bind_param dla tego, co widzę, wiąże "$ var" z każdym znakiem zapytania "?" w celu.

Tak więc z jednym bind_param() mogę powiązać je wszystkie w tym samym czasie, a normalne użycie bind_param() wymaga określenia typu danych, które są wiązane.

Moja pierwsza wartość do wiązania to $nome ciąg określony przez "s";

A pozostałe $telefone i $bi są liczbami całkowitymi, ponieważ mają "i";

Dla innych, którzy mają podobny problem, są inne typy danych (php.net).

i = Integer;

s = String;

d = Double;

b = Blob;

Jeśli ktoś ma lepsze wyjaśnienie, proszę go opublikować lub skomentować. Więc mogę poprawić własne.

Dzięki.

Odpowiedz

6

Możesz myśleć, nie ma nic złego w związku, ale należy sprawdzić, czy:

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

EDIT:

Co się dzieje, kiedy zrobić:

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

?

Czy tabela coisas jest poprawnie napisana?

+0

Dobra sugestia co do najlepszej praktyki. Próbowałem, ale to nie rozwiązało problemu. Każdy inny pomysł? –

+0

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

+0

Dobrze to słyszeć Fábio. –

2

zrobić print_r na $ stmt po przywróceniu go na linii 4. Czy to jest prawdziwy obiekt? Zgaduję, że nie.

+0

Nie jestem pewien, co to może zrobić, ale. Problem polegał na tym, że ja jako używający paramingu wiązania dla każdej wartości, mógłbym użyć tylko jednego i nie wspomniałem o typie wartości wejściowej (s = string | i = integer). Dzięki, w każdy sposób. –

+0

Błąd wskazywał, że obiekt ($ stmt), do którego wywołałeś metodę, nie był w rzeczywistości obiektem. To mogło zaatakować w tej metodzie, ale najpierw domyślałem się, że było to w ogóle zerowe stmt. – Zak

Powiązane problemy