Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Przerobienie zapytania SQL, prepared statement
XhtmlProject
post 8.07.2012, 18:55:08
Post #1





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 11.11.2005
Skąd: RuskieJaKraina

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


Witam, potrzebuję przerobić poniższe zapytanie (nie wiem jak wstawić operator LIKE):

  1. <?php
  2. if(isset($_REQUEST['word'])) {
  3. $word = stripslashes($_REQUEST['word']);
  4. // Prepared Statement
  5. $db = new mysqli('#*$!', '#*$!', '#*$!', '#*$!');
  6. $db -> query("SET NAMES 'latin2'");
  7. $stmt = $db->stmt_init();
  8. if($stmt->prepare("SELECT `user_id`, `model`, `vendor`, `registration_date` FROM `my_database` WHERE `model` = ? OR `vendor` = ? ORDER BY registration_date DESC")) {
  9. $stmt->bind_param('ss', $word,$word);
  10. $stmt->execute();
  11. $stmt->bind_result($id_var, $model_var, $vendor_var, $reg_var);
  12. while($stmt->fetch()) {
  13. echo '<table>';
  14. echo '<td><b>ID:</b> '.$id_var.'</td><tr />';
  15. echo '<td><b>Model:</b> '.$model_var.'</td><tr />';
  16. echo '<td><b>Wprowadzono:</b> '.$reg_var.'</td><tr />';
  17. echo '<td><b>Odnośnik:</b> <a href="http://www.mypage.com/catalog/detail.php?id='.$id_var.'">Go there</a></td><br />';
  18. echo '</table>';
  19. }}
  20.  
  21. else {
  22. echo 'There is no word in database<br />';
  23. echo $word;
  24. }
  25. }
  26. ?>


Chce to zrobić tak jak na poniższym przykładzie:

  1. $query = 'SELECT user_id, model, vendor FROM my_database WHERE model LIKE '%' . $word . '%' OR vendor LIKE '%' . $word . '%' ORDER BY registration_date DESC';


Ok poradziłem sobie, przykład dla potomnych:

  1. if($stmt->prepare("SELECT `user_id`, `model`, `vendor`, `registration_date` FROM `$search_type` WHERE `model` LIKE CONCAT('%',?,'%') OR `vendor` LIKE CONCAT('%',?,'%') ORDER BY registration_date DESC")) {


Ten post edytował XhtmlProject 8.07.2012, 19:10:57


--------------------
Flash
Go to the top of the page
+Quote Post
lukaskolista
post 8.07.2012, 20:34:18
Post #2





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Tylko po co zaprzegac system bazodanowy do laczenia stringow, skoro pochodza one tylko i wylacznie z srodowiska php?
Go to the top of the page
+Quote Post
SmokAnalog
post 8.07.2012, 22:53:40
Post #3





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Możesz również dodać znaki procentów w momencie podawania wartości parametru. Oba sposoby zadziałają.
Go to the top of the page
+Quote Post
lukaskolista
post 9.07.2012, 07:16:53
Post #4





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Wiem, ze zadzialaja, ale z optymalizacyjnego punktu widzenia tylko jeden jest poprawny smile.gif

Jedna z podstawowych zasad: to, ze cos dziala nie znaczy, ze jest dobrze zrobione.
Go to the top of the page
+Quote Post
SmokAnalog
post 9.07.2012, 09:47:16
Post #5





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Cytat(lukaskolista @ 9.07.2012, 08:16:53 ) *
Wiem, ze zadzialaja, ale z optymalizacyjnego punktu widzenia tylko jeden jest poprawny smile.gif

Jedna z podstawowych zasad: to, ze cos dziala nie znaczy, ze jest dobrze zrobione.

A w jakim sensie to nie jest dobrze zrobione?
  1. $sth->bindValue(':word', '%'.$word.'%', PDO::PARAM_STR);
Go to the top of the page
+Quote Post
lukaskolista
post 9.07.2012, 11:09:36
Post #6





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Pokaz mi ta linijke w jego kodzie, bo jej jakos nie widze.
Go to the top of the page
+Quote Post
XhtmlProject
post 9.07.2012, 14:40:02
Post #7





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 11.11.2005
Skąd: RuskieJaKraina

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


Dzięki za info.

Jeszcze jedno, jeśli w bazie mam zapisany model urządzenia:

JVs200

jak mogę na moim przykładzie napisać kod, żeby po wpisaniu jvs200 lub Jvs200 lub jvS znalazł JVs200

?

Ten post edytował XhtmlProject 9.07.2012, 14:40:41


--------------------
Flash
Go to the top of the page
+Quote Post
SmokAnalog
post 9.07.2012, 14:44:37
Post #8





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Większość kodowań w MySQL ignoruje wielkość liter dla porównań, w tym dla LIKE. Jeśli nie korzystasz np. Z UTF8 binarnego, to wystarczy zwyczajny LIKE.
Go to the top of the page
+Quote Post
CuteOne
post 9.07.2012, 14:45:12
Post #9





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


  1. $text = strtolower('Hd3dJ');
  2.  
  3. //query
  4. SELECT * FROM xxx WHERE LOWER(`yyy`) = '$text'


ps. nie używaj LIKE do tak prostych zapytań bo narobisz sobie kłopotów smile.gif

Ten post edytował CuteOne 9.07.2012, 14:53:34
Go to the top of the page
+Quote Post
XhtmlProject
post 9.07.2012, 15:14:45
Post #10





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 11.11.2005
Skąd: RuskieJaKraina

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


Działa z ->
  1. $word= strtolower($word);


Dzięki.


Cytat(CuteOne @ 9.07.2012, 15:45:12 ) *
  1. //query
  2. SELECT * FROM xxx WHERE LOWER(`yyy`) = '$text'

ps. nie używaj LIKE do tak prostych zapytań bo narobisz sobie kłopotów smile.gif


Kłopotów w jakim sensie ?


--------------------
Flash
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: 24.06.2025 - 01:55