Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [PHP][SQL][MySQL]prepare & mysqli

Napisany przez: eminiasty 17.08.2017, 20:33:56

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. http://www.php.net/echo $row['id'];
  15.  
  16. }
  17.  
  18. }

Napisany przez: trueblue 17.08.2017, 20:48:09

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. http://www.php.net/echo 1;

Napisany przez: eminiasty 18.08.2017, 08:09:03

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?

Napisany przez: viking 18.08.2017, 08:19:35

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.

Napisany przez: eminiasty 19.08.2017, 12:58:27

  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. http://www.php.net/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?

Napisany przez: trueblue 19.08.2017, 13:01:50

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.

Napisany przez: viking 19.08.2017, 13:19:59

Czemu active jest stringiem?
https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html
Szukaj BOOL, BOOLEAN

Napisany przez: eminiasty 19.08.2017, 13:40:37

  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ć?

Napisany przez: viking 19.08.2017, 13:43:58

Jeśli id jest auto increment to powinno się pominąć.

Napisany przez: eminiasty 19.08.2017, 13:53:28

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?

Napisany przez: viking 19.08.2017, 14:02:32

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.

Napisany przez: eminiasty 19.08.2017, 16:22:26

  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?

Napisany przez: trueblue 19.08.2017, 16:25:41

A w jaki sposób chciałbyś bindować rekordy?

Napisany przez: eminiasty 19.08.2017, 16:49:00

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?

Napisany przez: viking 19.08.2017, 17:06:26

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.

Napisany przez: eminiasty 20.08.2017, 21:17:53

rozumiem, a co ze spacjami?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)