Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL][MySQL]prepare & mysqli
Forum PHP.pl > Forum > Przedszkole
eminiasty
Czy poniższy kod da się jakoś uprościć i czy w ogóle jest poprawny?
  1. $value ='1';
  2.  
  3. $stmt = $link->prepare("SELECT id FROM " . $db_prefix . "test WHERE id = ?");
  4.  
  5.  
  6. $stmt->bind_param('i', $value);
  7.  
  8. if($stmt->execute()) {
  9.  
  10. $result = $stmt->get_result();
  11.  
  12. while ($row = $result->fetch_assoc()) {
  13.  
  14. echo $row['id'];
  15.  
  16. }
  17.  
  18. }
trueblue
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:
  1. echo 1;
eminiasty
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?
viking
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.
eminiasty
  1. $query = "INSERT INTO '". $db_prefix ."'modules (`name`, `description`, `number`, `file_start`, `position`, `active`, `dateAdd`) VALUES (?,?,?,?,?,?,?)";
  2. $stmt = $link->prepare($query);
  3. $stmt->bind_param("ssisiss", $name, $description, $name, $number, $start_file, $active, $today);
  4. /* Execute the statement */
  5. $stmt->execute();
  6. echo 'ok';


Fatal error: Uncaught Error: Call to a member function bind_param() on boolean in


Ktoś podpowie o co tu chodzi?

Czy date binduje sie jako s - string? Czy wogle sie nie binduje?
trueblue
A nie jest szybciej zerknąć na Google niż pisać post tu i czekać na odpowiedź?
https://www.google.com/search?q=Fatal+error...)+on+boolean+in

Datę binduje się jako string.
viking
Czemu active jest stringiem?
https://dev.mysql.com/doc/refman/5.7/en/num...e-overview.html
Szukaj BOOL, BOOLEAN
eminiasty
  1. $query = "INSERT INTO " . $db_prefix . "modules (`id`,`name`, `description`, `number`, `file_start`, `position`, `active`, `dateAdd`) VALUES ('',?,?,?,?,?,?,?)";
  2. $stmt = $link->prepare($query);
  3. $stmt->bind_param("ssisiss", $name, $description, $name, $number, $start_file, $active, $today);
  4. /* Execute the statement */
  5. $stmt->execute();


Tak jest w porządku, ale czy tego id nie powinno się jakoś też zbindować?
viking
Jeśli id jest auto increment to powinno się pominąć.
eminiasty
Odnośnie $active, pole w bazie jest typu tinyint(i)
W form jest:
  1. <div class="form-group">
  2. <label for="ActiveModule">Aktywny</label>
  3. <div class="checkbox">
  4. <label><input name="active" type="radio" value="1" id='ActiveModule' required>TAK</label>
  5. <label><input name="active" type="radio" value="0" checked>NIE</label>
  6. </div>
  7. </div>

Czy da sie tu użyć bindowania jako b wgole? Pytam dlatego, że do bazy zwraca zawsze 0?
viking
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.
eminiasty
  1. $query = "SELECT * FROM `modules` ";


a jeśli mam zapytanie tego typu? tu chyba nie ma co bindować? czy w takim przypadku binduje sie wszystkie rekordy z tabeli po kolei?
trueblue
A w jaki sposób chciałbyś bindować rekordy?
eminiasty
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:
  1. $query = "SELECT `number` FROM `" . $db_prefix . "modules` WHERE `number` = ? ";

Gdy poprawie je tak: (spacja po from)
  1. $query = "SELECT `number` FROM`" . $db_prefix . "modules` WHERE `number` = ? ";

jest porzadku


to samo mam z
  1. "INSERT INTO "


  1. "INSERT INTO"


przecież jak potem nawet robie dump z zapytania to jest FROM`costam` bez spacji? i to jest niby dobrze?
wlasnie przezucilem sie na phpstroma, pierwszy raz widze taki problem?
viking
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.
eminiasty
rozumiem, a co ze spacjami?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.