Czy poniższy kod da się jakoś uprościć i czy w ogóle jest poprawny?
$value ='1'; $stmt = $link->prepare("SELECT id FROM " . $db_prefix . "test WHERE id = ?"); $stmt->bind_param('i', $value); if($stmt->execute()) { $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { http://www.php.net/echo $row['id']; } }
1. Nie musisz bindować wartości zmiennej, którą zadałeś na sztywno w kodzie.
2. Czy id w tabeli jest unikalne? Jeśli tak, to dodaj LIMIT 1 do zapytania. Pobieranie rekordów w pętli również nie jest potrzebne jeśli odpowiedź jest twierdząca.
No i jeśli faktycznie id jest unikalne, to możesz uprościć cały kod do:
http://www.php.net/echo 1;
Chodzilo mi wlasnie o wzor zapytan z bindowaniem. Gdyz wczesniej uzywalem mysqli ale bez prepare co bylo chyba bledem. Rozumiem ze jesli jest uniaklny rekord to nie uzywac bindowania. Ale jesli rekordow jest wiele? To jak je zwracac? Jak zrobic by nie bylo ich w kodzie? Jak to zrobic by bylo proste w odczytaniu?
Bindowania używasz wszędzie tam, gdzie dane pochodzą z niepewnego źródła (plus odpowiednie kodowanie). W praktyce lepiej używać zawsze - za jakiś czas, pracując w grupie, ktoś może wpaść na pomysł podmiany zmiennej z bezpiecznej na niepewną i leżysz. Moim zdaniem lepiej też od razu przyzwyczajać się do PDO zamiast mysqli. Jest wszędzie używane.
$query = "INSERT INTO '". $db_prefix ."'modules (`name`, `description`, `number`, `file_start`, `position`, `active`, `dateAdd`) VALUES (?,?,?,?,?,?,?)"; $stmt = $link->prepare($query); $stmt->bind_param("ssisiss", $name, $description, $name, $number, $start_file, $active, $today); /* Execute the statement */ $stmt->execute(); http://www.php.net/echo 'ok';
A nie jest szybciej zerknąć na Google niż pisać post tu i czekać na odpowiedź?
https://www.google.com/search?q=Fatal+error%3A+Uncaught+Error%3A+Call+to+a+member+function+bind_param()+on+boolean+in
Datę binduje się jako string.
Czemu active jest stringiem?
https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html
Szukaj BOOL, BOOLEAN
$query = "INSERT INTO " . $db_prefix . "modules (`id`,`name`, `description`, `number`, `file_start`, `position`, `active`, `dateAdd`) VALUES ('',?,?,?,?,?,?,?)"; $stmt = $link->prepare($query); $stmt->bind_param("ssisiss", $name, $description, $name, $number, $start_file, $active, $today); /* Execute the statement */ $stmt->execute();
Jeśli id jest auto increment to powinno się pominąć.
Odnośnie $active, pole w bazie jest typu tinyint(i)
W form jest:
<div class="form-group"> <label for="ActiveModule">Aktywny</label> <div class="checkbox"> <label><input name="active" type="radio" value="1" id='ActiveModule' required>TAK</label> <label><input name="active" type="radio" value="0" checked>NIE</label> </div> </div>
Nie rzuca ci się w oczy że coś jest nie tak? Y-m-d H:m:s albo miesiąc, albo minuta. Sprawdź dokumentację i zobacz od razu 'c'. Boolean możesz odpowiednio przetworzyć np przez filter_var. #1 pewnie kolejny głupi błąd gdzieś w kodzie.
$query = "SELECT * FROM `modules` ";
A w jaki sposób chciałbyś bindować rekordy?
WHERE cos=? , cos =?
i tak wszystki po kolei? nie mam pomyslu wlasnie
I jeszcze jedno poz tematem bo nie rozumiem pewnej rzeczy.Tzn.
Zapytanie dziala poprawnie, ale kompilator pokazuje je na czerwono:
$query = "SELECT `number` FROM `" . $db_prefix . "modules` WHERE `number` = ? ";
$query = "SELECT `number` FROM`" . $db_prefix . "modules` WHERE `number` = ? ";
"INSERT INTO "
"INSERT INTO"
Przeczytaj jeszcze raz mój 4 post. W stopce mam artykuł o PDO który pokazuje bindowanie. where używasz jak masz warunek konkretny a nie zawsze.
rozumiem, a co ze spacjami?
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)