Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Połączenie rekordów z 2 kolumn
Forum PHP.pl > Forum > Przedszkole
Przemo75
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
nospor
w zapytaniu tworzysz parametr
:id
a w php odwolujesz sie do
:marka

przenosze
Przemo75
Przed "rozszerzeniem" selecta "model" wszystko działało bezproblemowo. Schody zaczynają się dopiero teraz.
nospor
Nie wnikam co miales wczesniej. Mowie ci gdzie masz banalny blad. Tak ciezko poprawic?
Przemo75
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?
nospor
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
Przemo75
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));

nospor
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
Przemo75
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ść"?
nospor
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
Przemo75
"+" 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)
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-2025 Invision Power Services, Inc.