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.
Dobra sugestia co do najlepszej praktyki. Próbowałem, ale to nie rozwiązało problemu. Każdy inny pomysł? –
$ stmt-> bind_param ("sii", $ nome, $ telefone, $ bi); Pracował. –
Dobrze to słyszeć Fábio. –