Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][SQL][MySQL]prepare & mysqli
eminiasty
post 17.08.2017, 20:33:56
Post #1





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

Ostrzeżenie: (0%)
-----


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. }
Go to the top of the page
+Quote Post
trueblue
post 17.08.2017, 20:48:09
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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;


--------------------
Go to the top of the page
+Quote Post
eminiasty
post 18.08.2017, 08:09:03
Post #3





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
viking
post 18.08.2017, 08:19:35
Post #4





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
eminiasty
post 19.08.2017, 12:58:27
Post #5





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

Ostrzeżenie: (0%)
-----


  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?
Go to the top of the page
+Quote Post
trueblue
post 19.08.2017, 13:01:50
Post #6





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
viking
post 19.08.2017, 13:19:59
Post #7





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
eminiasty
post 19.08.2017, 13:40:37
Post #8





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

Ostrzeżenie: (0%)
-----


  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ć?
Go to the top of the page
+Quote Post
viking
post 19.08.2017, 13:43:58
Post #9





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
eminiasty
post 19.08.2017, 13:53:28
Post #10





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

Ostrzeżenie: (0%)
-----


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?

Ten post edytował eminiasty 19.08.2017, 14:02:40
Go to the top of the page
+Quote Post
viking
post 19.08.2017, 14:02:32
Post #11





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
eminiasty
post 19.08.2017, 16:22:26
Post #12





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

Ostrzeżenie: (0%)
-----


  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?
Go to the top of the page
+Quote Post
trueblue
post 19.08.2017, 16:25:41
Post #13





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
eminiasty
post 19.08.2017, 16:49:00
Post #14





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
viking
post 19.08.2017, 17:06:26
Post #15





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
eminiasty
post 20.08.2017, 21:17:53
Post #16





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

Ostrzeżenie: (0%)
-----


rozumiem, a co ze spacjami?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 13:37