timeo
8.10.2016, 13:18:12
Mam dwa pliki cennik5.php i getdata.php. Chcę mieć dwie listy rozwijane zależne od siebie pobierające dane z bazy sql. Pierwsza pięknie pobiera druga nie. Połączenie w configbase i jest połączenie. Podpowiedzcie co robię nie tak.
<?php include('../configbase.php'); ?>
<!Doctype html>
<html>
<head>
<title></title>
</head>
<body>
<label>Marka</label>
<select name="marka" onchange="getId(this.value);">
<option value=""> Wybierz Markę</option>
<?php
$result = $db->prepare("SELECT * FROM Marki");
$result ->execute();
foreach($result as $marki){
?>
<option value="
<?php echo $marki["CID"]; ?>">
<?php echo $marki["Marka"];<?php
}
?>
</select>
<label>Model</label>
<select name="model" id="listamodeli">
<option value=""></option>
</select>
<scritp src="//code.jquery.com/jquery-1.12.0.min.js"></script>
<script>
function getId(val){
$.ajax({
type: "POST",
url: "getdata.php",
data: "CID="+val,
success: function(data){
$(#listamodeli).html(data);
}
});
}
</script>
</body>
</html>
getata.php
<?php
include ("../configbase.php");
if (!empty($_POST["CID"])){
//$cid = $_POST["CID"];
$result = $db->prepare("SELECT * FROM cennikmobi10 WHERE CID = :cid");
$result -> bindValue(':cid', $_POST["CID"], PDO::PARAM_INT);
$result -> execute();
foreach ($result as $model)
{
?>
<option value="
<?php echo $model["Model_ID"]; ?>">
<?php echo $model["Model"]; ?></option>
<?php
}
}
?>
trueblue
8.10.2016, 13:28:15
Metoda execute zwraca prawdę, albo fałsz, czyli w obydwu przypadkach nie pobierasz wyników.
W pierwszym przypadku prepare nie jest potrzebne, wystarczy query+fetch/fetchAll.
timeo
10.10.2016, 05:31:18
Zmieniłem i nadal nic. Spójrzcie.
Wszystkie kolumny w db są. Rekordy w rozwijaku mi się pojawiają, bo zrobiłem print_r i jest to co mi potrzebne. Być może coś z AJAX jest nie tak. Nie wiem już gdzie szukać.
<?php include('../configbase.php'); ?>
<!Doctype html>
<html>
<head>
<title></title>
</head>
<body>
<label>Marka</label>
<select name="marka" onchange="getId(this.value);">
<option value=""> Wybierz Markę</option>
<?php
$result = $db->query("SELECT * FROM Marki");
// $result ->execute();
//
//$marki = $result ->fetch(PDO::FETCH_ASSOC)
foreach($result as $marki)
{
?>
<option value="
<?php echo $marki["CID"]; ?>">
<?php echo $marki["Marka"];<?php
}
?>
</select>
<label>Model</label>
<select name="model" id="listamodeli">
<option value=""></option>
</select>
<scritp src="//code.jquery.com/jquery-1.12.0.min.js"></script>
<script>
function getId(val){
$.ajax({
type: "POST",
url: "getdata.php",
data: "CID="+val,
success: function(data){
$(#listamodeli).html(data);
}
});
}
</script>
</body>
</html>
<?php
include ("../configbase.php");
if (!empty($_POST["CID"])){
//$cid = $_POST["CID"];
$result = $db->prepare("SELECT * FROM cennikmobi10 WHERE MODEL_ID = :cid");
$result -> bindValue(':cid', $_POST["CID"], PDO::PARAM_INT);
//$result -> execute();
foreach ($result as $model)
{
?>
<option value="
<?php echo $model["Model_ID"]; ?>">
<?php echo $model["Model"]; ?></option>
<?php
}
}
?>
trueblue
10.10.2016, 07:31:44
Nadal nie pobierasz rekordów.
Jeśli masz coś w zmiennej $marki, to na pewno nie z powyższego kodu, bo w nim nigdzie nie ustalasz wartości tej zmiennej.
timeo
10.10.2016, 07:48:49
Poniższy kod nic nie daje.
$marki = $result ->fetch(PDO::FETCH_ASSOC)
Jest tylko jeden rekord i nie przekazuje dalej zmiennej.
Szukam dalej. Może jakaś podpowiedź z czym ten fetch zestawić?
TAK?
while($result = $marki ->fetch()) // foreach($result as $marki)
{
?>
<option value="
<?php echo $marki["Marka_ID"]; ?>">
<?php echo $marki["Marka"];<?php
}
?>
trueblue
10.10.2016, 08:03:18
Możesz fetchAll, tak jak pisałem?
timeo
10.10.2016, 09:13:01
Zrobiłem tak, ale efekt mizerny
<?php
$result = $db->query("SELECT * FROM Marki");
// $result ->execute();
//
$marki = $result->fetchAll();
{
?>
<option value="
<?php echo $marki["CID"]; ?>">
<?php echo $marki["Marka"];//print_r($marki); ?> </option>
<?php
}
?>
trueblue
10.10.2016, 09:16:24
Może dlatego, że nie iterujesz po elementach tablicy? Czyli brak np. foreach.
timeo
10.10.2016, 09:30:52
Dobrze zapytam.. No nadal nic
$result = $db->query("SELECT * FROM Marki");
$key = $result->fetchAll();
foreach ($key as $marki) {
?>
<option value="
<?php echo $marki["CID"]; ?>">
<?php echo $marki["Marka"]; ?> </option>
<?php
}
?>
trueblue
10.10.2016, 09:33:50
Pokaż co wyświetla wynik: var_dump($key); (po fetchAll).
timeo
10.10.2016, 09:41:01
Na stronie nic nie pokazuje, jest tylko lista z wszystkimi markami.
Mogę podać kod źródłowy strony, jeśli to coś pomoże.
viking
10.10.2016, 10:21:45
Wstaw pierwszy wiersz tablicy, żeby określić czy faktycznie są takie klucze jak piszesz.
timeo
10.10.2016, 10:43:17
Nie bardzo rozumiem. Z bazy danych mam wstawić wiersz?
viking
10.10.2016, 11:09:57
Pierwszy element z tablicy var_dump($key); albo inaczej var_dump($key[0]);
timeo
10.10.2016, 11:14:37
Na stronie nic mi nie pokazuje. Są tylko dwie optionlist z czego jedna ma marki (czyli pokazuje mi wszystkie elementy z tablicy) a druga jest pusta. Wrzuciłem to
<?php
$result = $db->query("SELECT * FROM Marki");
// $result ->execute();
//
$key = $result->fetchAll(PDO::FETCH_ASSOC);
foreach ($key as $marki)
{
?>
<option value="
<?php echo $marki["Marka_ID"]; ?>">
<?php echo $marki["Marka"];?> </option>
<?php
}
?>
viking
10.10.2016, 11:23:49
Czyli wychodzi z tego że zapytanie nic nie zwraca.
timeo
10.10.2016, 11:26:45
Czy w związku z tym jakoś inaczej pytanie wprowadzić?
Jednak lista marek jest - pytanie dlaczego?
Mogę ewentualnie podać adres odnośnika, żeby pokazać Wam gdzie leży błąd. Nie wiem jak regulamin.
viking
10.10.2016, 11:32:00
Wstaw bo tak można gdybać. I włącz raportowanie błędów.
timeo
10.10.2016, 11:34:44
Ups - a jak włączyć raportowanie błędów - podpowiedz.
Testy
viking
10.10.2016, 11:39:21
Po stronie php masz <b>Notice</b>: Undefined offset: 0 in <b>/home/vol2_1/byethost15.com/b15_3428001/bdp.22web.org/htdocs/mobidoktor/cennik5.php</b> on line <b>24</b><br /> Co jest w tej linii?
Po stronie JS: SyntaxError: illegal character $(#listamodeli).html(data); powinno być $('#listamodeli')
timeo
10.10.2016, 11:42:29
Już poprawiam - usuwam:
I JS też poprawiam
KOD wygląda tak
<?php include('../configbase.php');
?>
<!Doctype html>
<html>
<head>
<title></title>
</head>
<body>
<label>Marka</label>
<select name="marka" onchange="getId(this.value);">
<option value=""> Wybierz Markę</option>
<?php
$result = $db->query('SELECT * FROM Marki');
// $result ->execute();
//
$key = $result->fetchAll(PDO::FETCH_ASSOC);
foreach ($key as $marki)
{
?>
<option value="
<?php echo $marki["Marka_ID"]; ?>">
<?php echo $marki["Marka"];?> </option>
<?php
}
?>
</select>
<label>Model</label>
<select name="model" id="listamodeli">
<option value=""></option></select>
<scritp src="//code.jquery.com/jquery-1.12.0.min.js"></script>
<script>
function getId(val){
$.ajax({
type: "POST",
url: "getdata.php",
data: "Marka_ID="+val,
success: function(data){
$('#listamodeli').html(data);
}
});
}
</script>
</body>
</html>
GETDATA PHP
<?php
include ("../configbase.php");
if (!empty($_POST["Marka_ID"])){
//$cid = $_POST["CID"];
$result = $db->query("SELECT * FROM cennikmobi10 WHERE ID = :cid");
$result -> bindValue(':cid', $_POST["Marka_ID"], PDO::PARAM_INT);
//$result -> execute();
foreach ($result as $model)
{
?>
<option value="
<?php echo $model["Marka_ID"]; ?>">
<?php echo $model["Model"]; ?></option>
<?php
}
}
?>
viking
10.10.2016, 11:59:55
Masz jeszcze błędy w JS ReferenceError: $ is not defined, opakuj to w
Kod
$(function() {
});
Zresztą marki ci dzialają.
I script nie scritp.
timeo
10.10.2016, 12:21:25
Poprawiłem, ale nadal nie widzę poprawy. Niestety moja wiedz ogranicza się do prośby o Waszą pomoc.
viking
10.10.2016, 12:28:22
Zerknij czasami w konsolę. Teraz masz ReferenceError: getId is not defined
Całe script wrzuć do head.
timeo
10.10.2016, 12:55:01
Przerzuciłem i pokazuje mi to samo. Nie wiem czy gdzieś w JS trzeba definiować ten parametr?
viking
10.10.2016, 13:13:12
Zamiast inline przrzuć to do script
$('select[name="marka"]').on('change', function(e) {
getId(this.value);
});
timeo
10.10.2016, 13:22:43
W ten sposób?
<script>
$(function() {
function getId(val){
$.ajax({
type: "POST",
url: "getdata.php",
data: "Marka_ID="+val,
success: function(data){
$('select[name="marka"]').on('change', function(e) {
getId(this.value);
});
}
});
}
});
</script>
viking
10.10.2016, 13:26:12
No nie. getId wywołujesz na zmianę selecta. Pomyśl chwilkę logicznie.
Pod tę funkcję.
timeo
10.10.2016, 14:12:19
Czyli, że tak?
<label>Marka</label>
<select name="marka" onchange="$('select[name="marka"]').on('change', function(e) {
getId(this.value);
});">
<option value=""> Wybierz Markę</option>
cennik5.php:28 Uncaught SyntaxError: Invalid or unexpected token
viking
10.10.2016, 14:17:10
No nie. Wywalasz to całe onchange z selecta i zapominasz o takim pisaniu JS. A kod który podałem wklejasz pod funkcję.
timeo
10.10.2016, 14:33:24
Już się boję pytać, ale spróbuję
Za GETID odpowiedzialna jest funkcja w JS, więc teraz myślę, że myślę dobrze.
<script src="//code.jquery.com/jquery-1.12.0.min.js"></script>
<script>
$(function() {
function getId(val){
$('select[name="marka"]').on('change', function(e) {
getId(this.value);
});
$.ajax({
type: "POST",
url: "getdata.php",
data: "Marka_ID="+val,
success: function(data){
$('#listamodeli').html(data);
}
});
}
});
</script>
viking
10.10.2016, 14:37:23
Pfff. Tym sposobem byś nigdzie funkcji nie wywołał.
Cytat
function getId(val){...}
$('select[name="marka"]').on('change', function(e) {
getId(this.value);
});
timeo
10.10.2016, 14:48:27
Zmieniłem i konsola pokazuje mi:
(link jest cały czas aktywny jakby co

)
POST <a href="http://nastrone.eu/mobidoktor/getdata.php" target="_blank">http://nastrone.eu/mobidoktor/getdata.php</a> 500 (Internal Server Error)send @ jquery-1.12.0.min.js:4ajax @ jquery-1.12.0.min.js:4getId @ cennik5.php:10onchange @ cennik5.php:27ListPicker._handleMouseUp @ about:blank:686
viking
10.10.2016, 14:52:26
Gdzieś w getdata masz problem. Zobacz logi serwera i włącz też wyświeltanie błędów.
timeo
10.10.2016, 15:03:57
Wrzuciłem do GETDATA i niestety nic nie pokazuje.
Żadnego błędu. Poszukam jak dojadę do domu.
viking
10.10.2016, 15:09:50
Ja tam widzę:
Cytat
<b>Fatal error</b>: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or
access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near ':cid' at line 1'
A wynika to stąd, że query nie binduje parametrów tylko prepare.
trueblue
10.10.2016, 15:39:57
I znów nie pobierasz wyników w getdata.php.
query w pierwszym przypadku, tak jak pisałem, bo nie bindujesz, więc nie trzeba. W drugim zgodnie ze wskazówką viking'a, prepare.
timeo
10.10.2016, 18:30:11
Panowie czapki z głów. Dziękuję - jesteście WIELCY. Od dzisiaj to forum jest moim forum.
Nie zrobiłbym niczego bez Waszej pomocy!!!
Każdemu piwq
A tutaj kod jaki działa.
<?php include('../configbase.php');
?>
<!Doctype html>
<html>
<head>
<title></title>
<script src="//code.jquery.com/jquery-1.12.0.min.js"></script>
<script>
function getId(val){
$.ajax({
type: "POST",
url: "getdata.php",
data: "Marka_ID="+val,
success: function(data){
$('#listamodeli').html(data);
}
});
}
$('select[name="marka"]').on('change', function(e) {
getId(this.value);
});
</script>
</head>
<body>
<label>Marka</label>
<select name="marka" onchange="getId(this.value)">
<option value=""> Wybierz Markę</option>
<?php
$result = $db->query('SELECT * FROM Marki');
// $result ->execute();
//
$key = $result->fetchAll(PDO::FETCH_ASSOC);
foreach ($key as $marki)
{
?>
<option value="
<?php echo $marki["Marka_ID"]; ?>">
<?php echo $marki["Marka"];?> </option>
<?php
}
?>
</select>
<label>Model</label>
<select name="model" id="listamodeli">
<option value=""></option></select>
</body>
</html>
getdada
<?php
include ("../configbase.php");
if (!empty($_POST["Marka_ID"])){
//$cid = $_POST["CID"];
$result = $db->prepare("SELECT * FROM cennikmobi10 WHERE ID = :cid");
$result -> bindValue(':cid', $_POST["Marka_ID"], PDO::PARAM_INT);
$result -> execute();
foreach ($result as $model)
{
?>
<option value="
<?php echo $model["Marka_ID"]; ?>">
<?php echo $model["Model"]; ?></option>
<?php
}
}
?>
viking
10.10.2016, 18:55:32
Miałeś się pozbyć onchange="getId(this.value)" z select.
To teraz jeszcze pomyśl co się stanie w przypadku błędu. Nie oprogramowałeś wyjątków PDO, nie robisz nic w przypadku błędu żądania ajaxowego - done/fail. I produkcyjnie informacje debugowe (error_reporting) mają być wyłączone. Brak ci odpowiednich nagłówków. Czemu takie stare jquery? Jest już v3.
timeo
11.10.2016, 08:36:08
Już poprawiam.
To będzie zahasłowane i zaszyfrowane logowaniem i nikt nie będzie miał dostępu. Będę to eweluuował, ale trochę później. Na szybko jest mi potrzebne. Nie znam zbytnio JS i Ajaxa muszę się nauczyć.
Teraz mam pytanie i prośbę. Działa, ale jest jeden mały problem - modeli jest kilka do jednej marki. Co zrobić żeby one się grupowały?
Wystarczy Group By? - wystarczy
Wyrzuciłem onchange tak jak kazałeś, ale przestaje działać.
<script src="//code.jquery.com/jquery-3.1.1.min.js"></script>
P.S.
Dopiero do tego usiadłem i już zmieniam.
Plik configbase
try {
$db = new PDO
('mysql:host=localhost;dbname=artykuly', 'root', '', array(PDO
::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die( "Połączenie nie mogło zostać utworzone: {$e->getMessage()}"); }
A teraz dziwne pytanie jakbym chciał zrobić jeszcze 3 listę zależną od drugiej? Da się jakoś z tego co mam?
viking
11.10.2016, 10:58:26
Dokładnie tak samo jak drugą. A co nie działało konkretnie z zapisem moim? Jakieś błędy w konsoli?
timeo
11.10.2016, 11:12:19
To miałem wyrzucić select
onchange="getId(this.value)"
a coś tam trzeba wstawić za to?
Czyli kolejny plik GETDATA, żeby pobierał i tam całe zapytanie?
viking
11.10.2016, 11:37:06
Kod który ci podałem
Cytat
$('select[name="marka"]').on('change', function(e) {
getId(this.value);
});
Jest dokładnie odpowiednikiem tego onchange liniowego. Możesz nowy plik albo dodatkową wartość.
Cytat
data: {"Marka_ID": val, costam2: y}
i w getdata sprawdzac czy występuje $_POST['costam2']
timeo
11.10.2016, 11:48:18
Ale on jest w script w head a nie w select. Select - jak to usunąłem to nie działał
Cytat
Cytat
$('select[name="marka"]').on('change', function(e) {
getId(this.value);
});
viking
11.10.2016, 11:53:35
timeo
11.10.2016, 12:44:51
Cytat(viking @ 11.10.2016, 12:53:35 )

Fakt tutaj tak, a u mnie nie.

Mozesz sam zobaczyć.
Klik
nospor
11.10.2016, 12:46:18
Tak z czystej ciekawosci: kiedy ty w koncu zaczniesz zagladac w konsole bledow js? Juz nie raz w tym temacie cie o to upominano a ty dalej swoje.... toz masz bledy tam.
timeo
11.10.2016, 14:51:45
Cytat(nospor @ 11.10.2016, 13:46:18 )

Tak z czystej ciekawosci: kiedy ty w koncu zaczniesz zagladac w konsole bledow js? Juz nie raz w tym temacie cie o to upominano a ty dalej swoje.... toz masz bledy tam.
Jak skończę wszystko co jest potrzebne mi a potem zabiorę się za błędy. Szybko potrzebuję strony, a potem kosmetyka.... i... nauka...
kapslokk
11.10.2016, 14:55:26
Czyli po prostu wolisz truć dupę na forum bo "nie działa" niż spojrzeć w konsole błedów, która mówi dlaczego nie działa, tak ? :/
timeo
12.10.2016, 10:47:26
Myślę, że ta dyskusja nie ma dalej sensu. Napiszę jak poprawię błędy i podeślę. Obiecuję, że to zrobię...

OK, pokazuje, że brakuje linii pomocnej, już szukam w googlu i poprawiam
Uncaught SyntaxError: Unexpected token <
Podpowiedzcie, czy ten kod jest poprawny
<script>
$.ajax({
type: "POST",
url: "getdata.php",
data: "Marka_ID="+val,
success: function(data){
$('select[name="marka"]').on('change', function(e) {
getId(this.value);
});
}
});
</script>
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.