Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Połączenie rekordów z 2 kolumn
Przemo75
post 3.04.2018, 12:23:27
Post #1





Grupa: Zarejestrowani
Postów: 66
Pomógł: 2
Dołączył: 9.03.2004
Skąd: POLSKA

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


Witam,
Potrzebuję przerobić wyszukiwarkę, żeby zamiast jednego z select'ów (model) wyświetlał połączone rekordy z 2 kolumn (model + nadwozie).

Mam takie coś:

  1. include('dbconfig.php');
  2. $action = $_REQUEST['action'];
  3.  
  4. if ($action=='showAll')
  5. {
  6. $id = "0";
  7. } else {
  8. $id=$_POST['id'];
  9. }
  10.  
  11. switch(true)
  12. {
  13. case ($action == 'showAll' OR ($action == 'marka' and $id == '')):
  14. default:
  15. $stmt=$DB_con->prepare('SELECT marka FROM haki2 GROUP BY marka');
  16. $stmt->execute();
  17. break;
  18.  
  19. case ($action == 'marka' OR ($action == 'model' and $id == '')):
  20. $marka = $_POST['marka'];
  21. $stmt=$DB_con->prepare('SELECT model FROM haki2 WHERE marka=:marka GROUP BY model ORDER BY model');
  22. $stmt->execute(array(':marka'=>$marka));
  23. break;
  24.  
  25. case ($action == 'model' OR ($action == 'rocznik' and $id == '')):
  26. $marka = $_POST['marka'];
  27. $model=str_replace("\\", "", $_POST['model']);
  28. $stmt=$DB_con->prepare('SELECT rok_produkcji FROM haki2 WHERE model=:model GROUP BY rok_produkcji ORDER BY rok_produkcji');
  29. $stmt->execute(array(':model'=>$model));
  30. break;
  31.  
  32. case ($action == 'rocznik'):
  33. $marka = $_POST['marka'];
  34. $model=str_replace("\\", "", $_POST['model']);
  35. $rocznik=str_replace("\\", "", $_POST['rocznik']);
  36. $stmt=$DB_con->prepare('SELECT * FROM haki2 WHERE model=:model AND rok_produkcji=:rocznik ORDER BY rok_produkcji');
  37. $stmt->execute(array(':model'=>$model, ':rocznik'=>$rocznik));
  38. break;
  39. }



Po zmianie zapytania na:

  1. $stmt=$DB_con->prepare('SELECT model, nadwozie, CONCAT(model, " - ", nadwozie) AS model_new FROM haki2 WHERE marka=:marka GROUP BY model_new ORDER BY model_new');


wyrzuca dwa błędy odnoszące się do linii:
  1. $stmt->execute(array(':marka'=>$marka));

1. Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined':
2. ( ! ) PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in E:\wamp\www\Tomek\2018-04-02\pokaz_haki.php on line 33

Ten post edytował Przemo75 3.04.2018, 14:35:49
Go to the top of the page
+Quote Post
nospor
post 3.04.2018, 12:29:48
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




w zapytaniu tworzysz parametr
:id
a w php odwolujesz sie do
:marka

przenosze


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Przemo75
post 3.04.2018, 12:40:45
Post #3





Grupa: Zarejestrowani
Postów: 66
Pomógł: 2
Dołączył: 9.03.2004
Skąd: POLSKA

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


Przed "rozszerzeniem" selecta "model" wszystko działało bezproblemowo. Schody zaczynają się dopiero teraz.
Go to the top of the page
+Quote Post
nospor
post 3.04.2018, 12:55:02
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Nie wnikam co miales wczesniej. Mowie ci gdzie masz banalny blad. Tak ciezko poprawic?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Przemo75
post 3.04.2018, 13:06:47
Post #5





Grupa: Zarejestrowani
Postów: 66
Pomógł: 2
Dołączył: 9.03.2004
Skąd: POLSKA

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


Cytat(nospor @ 3.04.2018, 13:55:02 ) *
Nie wnikam co miales wczesniej. Mowie ci gdzie masz banalny blad. Tak ciezko poprawic?

Przepraszam, nie miałem racji. Nie mogło działać, bo faktycznie przekleiłem z błędem. Poprawione.

W jaki sposób przerobić
  1. $stmt=$DB_con->prepare('SELECT rok_produkcji FROM haki2 WHERE model=:model GROUP BY rok_produkcji ORDER BY rok_produkcji');

żeby model był potraktowany jako wcześniejsze łączenie kolumn?

Ten post edytował Przemo75 3.04.2018, 13:10:53
Go to the top of the page
+Quote Post
nospor
post 3.04.2018, 13:15:41
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No to polacz jak to wczesniej laczyles. Choc to jest bez sensu bo tracisz indeksowanie. Rozbij model na te dwa pola i WHERE szukaj po tych dwoch wartosciach


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Przemo75
post 3.04.2018, 14:32:01
Post #7





Grupa: Zarejestrowani
Postów: 66
Pomógł: 2
Dołączył: 9.03.2004
Skąd: POLSKA

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


Próbowałem na różne sposoby, ale ani
  1. $stmt=$DB_con->prepare('SELECT rok_produkcji FROM haki2 WHERE CONCAT_WS(model, " - ", nadwozie) AS model_new=:model GROUP BY rok_produkcji ORDER BY rok_produkcji');

ani
  1. $stmt=$DB_con->prepare('SELECT rok_produkcji FROM haki2 WHERE model=:model AND nadwozie=:nadwozie GROUP BY rok_produkcji ORDER BY rok_produkcji');

nie działa poprawnie, bo ciągle wyrzuca błąd w
  1. $stmt->execute(array(':model_new'=>$model));

Go to the top of the page
+Quote Post
nospor
post 3.04.2018, 14:36:12
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Kiedy sie nauczysz ze :model w zapytaniu ma byc tez :model w bindowaniu? A nie zadne :model_new w bindowaniu a w zapytaniu :model... Naprawde nie widzisz analogii?

Poza tym nie
WHERE CONCAT_WS(model, " - ", nadwozie) AS model_new=:model
a:
WHERE CONCAT_WS(model, " - ", nadwozie)=:model


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Przemo75
post 4.04.2018, 07:15:03
Post #9





Grupa: Zarejestrowani
Postów: 66
Pomógł: 2
Dołączył: 9.03.2004
Skąd: POLSKA

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


Cytat(nospor @ 3.04.2018, 15:36:12 ) *
Kiedy sie nauczysz ze :model w zapytaniu ma byc tez :model w bindowaniu? A nie zadne :model_new w bindowaniu a w zapytaniu :model... Naprawde nie widzisz analogii?

Poza tym nie
WHERE CONCAT_WS(model, " - ", nadwozie) AS model_new=:model
a:
WHERE CONCAT_WS(model, " - ", nadwozie)=:model

Widziałem analogię ale trochę pokręciłem. :-(
Bardzo dziękuję za pomoc. Teraz wszystko działa jak należy. :-)



Niestety działa dobrze tylko lokalnie. :-(
Na serwerze niestety jest już problem. W nazwach gdzie występuje ' np. (marka) KIA (model) CEE'D SW - Kombi już nie wyświetla rocznika w select'ie.
W bazie marka zapisana jest jako CEE\'D SW. Wydawało by się, że nie będzie problemów dzięki
  1. $model = str_replace("\\", "", $_POST['model']);



Jak się okazało, lokalnie nie wszystko działa.
Niestety w jednej z łączonych kolumn (nadwozie) występują m.in. znaki "+" i ":", np. FORD KUGA - SUV, 2+4WD (dotyczy wiązki: wiązka rozbudowana)

Można to jakoś "obejść"?

Ten post edytował Przemo75 4.04.2018, 07:24:27
Go to the top of the page
+Quote Post
nospor
post 4.04.2018, 08:26:04
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Teraz widzisz na wlasne oczy jak sie konczy zle zaprojektowana baza danych. Zamiast po nazwach powinienies operowac po ID wowczas nie byloby takich problemow. Jak mozesz zmienic to zmien.
Jak nie to + czy : nie powinny miec tutaj zadnego znaczenia. Pewnie problem pojawia sie gdzies po drodze, np. w formularzu i sposobie jego wysylania


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Przemo75
post 4.04.2018, 10:22:55
Post #11





Grupa: Zarejestrowani
Postów: 66
Pomógł: 2
Dołączył: 9.03.2004
Skąd: POLSKA

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


"+" i ":" nie powinny a jednak mają znaczenie. Powiedzmy, że można to "obejść" i wyedytować "nieporządane" rekordy. metoda trochę toporna, ale ... :-(

Tylko dlaczego znowu nie chce teraz "przepuścić" rekordów z apostrofem (')? Być może, jak zauważyłeś, problem faktycznie leży po stronie formularza obsługującego Rocznik (get_rocznik.php):
  1. <?php
  2. include('dbconfig.php');
  3. if($_POST['id'])
  4. {
  5. $id=$_POST['id'];
  6. $action=$_POST['action'];
  7. $stmt=$DB_con->prepare('SELECT rok_produkcji AS rocznik FROM haki2 WHERE CONCAT_WS(" - ", model, nadwozie)=:id GROUP BY rocznik ORDER BY rocznik'); <--- lokalnie działa bez problemów
  8. // $stmt=$DB_con->prepare('SELECT rok_produkcji AS rocznik FROM haki2 WHERE model=:id GROUP BY rocznik ORDER BY rocznik'); <--- działało także na serwerze, kiedy nie było łączenia kolumn
  9. $stmt->execute(array(':id' => $id));
  10. echo "Akcja=" . $action ."\n";
  11. ?>
  12. <option value="" selected="selected">---Rocznik---</option>
  13. <?php
  14. while($row=$stmt->fetch(PDO::FETCH_ASSOC))
  15. {
  16. $rocznik = $row['rocznik'];
  17. ?>
  18. <option value="<?php echo $rocznik; ?>"><?php echo $rocznik; ?></option>
  19. <?php
  20. }
  21. }
  22. ?>

Powyższe działa lokalnie. Na serwerze nie działa, kiedy nazwa Modelu (teraz Model + Nadwozie) zawiera znak apostrof ('), np. CEE'D (w bazie jako CEE\'D)

Ten post edytował Przemo75 4.04.2018, 10:23:30
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: 13.07.2025 - 13:51