Aktualizace tabulky s relací M:N v MySQL přes PHP formulář – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama

Aktualizace tabulky s relací M:N v MySQL přes PHP formulář – PHP – Fórum – Programujte.comAktualizace tabulky s relací M:N v MySQL přes PHP formulář – PHP – Fórum – Programujte.com

 

Spuštěný nový filmový web Filmožrouti.cz — vše o Avengers, Pacific Rim, Thor, Star Wars…
David
~ Anonymní uživatel
164 příspěvků
23. 5. 2018   #1
-
0
-

Zdravím,

prosím o pomoc, mám následující problém:

Tvořím databázi železničních přejezdů. Databáze obsahuje relaci M:N pro přejezdy a výstražníky (jeden železniční přejezd může mít více typů výstražníků).

Zde je PHP skript, který předává data z formuláře do MySQL:

Připojen obrázek.

<?php

$id = $_GET["id"];
$cislo = $_GET["cislo"];
$sirka = $_GET["sirka"];
$delka = $_GET["delka"];
$rok_rekonstrukce = $_GET["rok_rekonstrukce"];
$foto = $_GET["foto"];
$PZZ = $_GET["PZZ"];
$obec = $_GET["obec"];
$silnice = $_GET["silnice"];
$vystrazniky_vyber = implode(', ', $_GET["vystrazniky"]);






include("pripojeni.php");

$sql = "UPDATE ZELEZNICNI_PREJEZDY, PREJEZDY_VYSTRAZNIKY SET cislo_prejezdu='$cislo', zemepisna_sirka='$sirka', zemepisna_delka='$delka', foto='$foto', ZELEZNICNI_PREJEZDY.id_PZZ='$PZZ', ZELEZNICNI_PREJEZDY.id_obce='$obec', ZELEZNICNI_PREJEZDY.id_silnice='$silnice', WHERE ZELEZNICNI_PREJEZDY.id_prejezdu='$id'"; 

if($rok_rekonstrukce != '' or $rok_rekonstrukce != null) {
$sql_rok = "UPDATE ZELEZNICNI_PREJEZDY SET rok_rekonstrukce='$rok_rekonstrukce' WHERE ZELEZNICNI_PREJEZDY.id_prejezdu='$id'";
}
else {
$sql_rok = "UPDATE ZELEZNICNI_PREJEZDY SET rok_rekonstrukce=null WHERE ZELEZNICNI_PREJEZDY.id_prejezdu='$id'";
}
$vystrazniky[] = explode(', ', $vystrazniky_vyber);
foreach($vystrazniky AS $id_vystrazniku) {
$sql_prejezdy_vystrazniky = "INSERT INTO PREJEZDY_VYSTRAZNIKY (id_prejezdu, id_vystrazniku) VALUES ('$id', '$id_vystrazniku'[\"id_vystrazniku]\")";
}

if (mysql_query($sql) && mysql_query($sql_rok) && mysql_query($sql_prejezdy_vystrazniky)) {
echo "<br>Aktualizace proběhla úspěšně."; }
else {
echo "<br>Aktualizace neproběhla úspěšně."; }

?>

Nedaří se mi aktualizovat pole pro typy výstražníků - skript pro aktualizaci vyhazuje tuto hlášku:

Připojen obrázek

Děkuji za případnou pomoc

David

Nahlásit jako SPAM
IP: 188.116.67.–
gna
~ Anonymní uživatel
687 příspěvků
24. 5. 2018   #2
-
+1
-
Zajímavé
Kit +

Tady na řádku 38 nic zajímavého není. Můžná u tebe je.

PREJEZDY_VYSTRAZNIKY je vazební tabulka, ne? Proč ji máš v tom prvním update? I kdyby jsi tam chtěl dvě tabulky, tak s jinou podmínkou a před WHERE máš nadbytečnou čárku.

V tom INSERTu máš [\"id_vystrazniku]\". Ty uvozovky jsou špatně a hlavně to tam vůbec nemá být.

Funkce mysql_error vrací popis chyby. A hlavně nestrkej data z GETu přímo do SQL.

Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
3368 příspěvků
24. 5. 2018   #3
-
0
-

Viz gna.
- Kdyz oznacim, udelam ctrl+c ctrl+v na radku 38 neni nic vyznamneho. Resp, je to presposledni radek, ktery je uplne prazdny. Takze bys musel rici, co na tom radku mas ty.
- Array to string conversion znamena, ze v miste, kde ocekaval string, ty mu davas array. Obvykle to byva u implode, explode nebo kdyz pracujes se stringy, jako spojovani retezcu sql prikazu.
- INSERT. Tam mas ty uvozovky uplne spatne. Nevim sice, co jsi chtel docilit, ale takhle to urcite napsat nelze. mozna to je prave ten radek 38!
VALUES ('$id', '$id_vystrazniku'[\"id_vystrazniku]\")
- S tou vazebni tabulkou to myslel tak, ze logicky musis zaznam nejdriv vlozit do hlavnich tabulek a az pak jej muzes zapisovat do vazebnich, propojit id toho zaznamu s jinym id z jine tabulky. V tom pripade ti tam i schazi ziskani last_insert_id. Ale nejspis mas duvod, proc to delas prave takhle, pouzivas id z $_GET

Nahlásit jako SPAM
IP: 2001:718:2601:258:8f3:be3...–
David
~ Anonymní uživatel
164 příspěvků
24. 5. 2018   #4
-
0
-

Děkuji za rady, vyzkouším to upravit a odepíšu, jak to fungovalo   

David

Nahlásit jako SPAM
IP: 188.116.90.–
MilanL+1
Věrný člen
24. 5. 2018   #5
-
0
-

#4 David
myslím, že data do základních tabulek má vytvořená a jde pouze o aktualizaci údajů, tzn přejezdy i typy výstražníků existují a jde jen o spárování.

- chybu ve values jsem viděl i já (php začátečník)

- možná by nebyla špatná kontrola zda je $id_vystrazniku nějaká hodnota

- otázkou je co udělá opakované doplňování, případně změna, kdy jeden výstražník nahradíš jiným, ve stávajícím kodu tam původní zůstane a přidá se nový případně se přidají další duplicitně pokud není v db indexem ošetřena duplicita (přejezd-výstražník)

Nahlásit jako SPAM
IP: 91.139.9.–
David
~ Anonymní uživatel
164 příspěvků
24. 5. 2018   #6
-
0
-

Je to tak, jak píše MilanL, jde mi opravdu o to spárování. Mám vytvořené tabulky:

  • ZELEZNICNI_PREJEZDY
  • PREJEZDY_VYSTRAZNIKY (vazební tabulka)
  • TYP_VYSTRAZNIKU

Chyby v kódu jsem se pokusil opravit. Neumím si poradit s tím, jak dostat typy výstražníků z formuláře (z prvku multiple select) do vazební tabulky - aby byly vloženy jednotlivé položky, nikoliv řetězec - např. 1 přejezd, 2 typy výstražníků. Vstupní formulář vypadá následovně:

Připojen obrázek.


Ještě jednou moc děkuji za váš čas a vaši pomoc.

David

Nahlásit jako SPAM
IP: 188.116.67.–
David
~ Anonymní uživatel
164 příspěvků
24. 5. 2018   #7
-
0
-

#5 MilanL
Opakovanému doplňování jsem se pokusil zabránit tak, že při aktualizaci záznamu budou smazány původní vazby - do kódu jsem doplnil SQL dotaz: DELETE FROM PREJEZDY_VYSTRAZNIKY WHERE id_prejezdu='$id'.

Zda je $id_vystrazniku nějaká hodnota, jsem se pokusil vyřešit podmínkou - IsSet.

Nahlásit jako SPAM
IP: 188.116.67.–
gna
~ Anonymní uživatel
687 příspěvků
24. 5. 2018   #8
-
0
-

Dáváš do value id záznamu?

<option value="1">Metelesku</option>
<option value="2">Blesku</option>
Nahlásit jako SPAM
IP: 213.211.51.–
Kit+14
Guru
24. 5. 2018   #9
-
0
-

#1 David
Při vkládání nového železničního přejezdu (také při modifikaci) by se neměla používat metoda GET, ale POST.

V příkladu máš zranitelost SQL Injection. Bylo by dobré to opravit dřív, než ti někdo zničí data v databázi.

Když dáš unikátní index na oba cizí klíče ve vazební tabulce, tak ti duplicity vznikat nebudou. Můžeš si vybrat, zda při pokusu o duplicitu bude druhý záznam odmítnut nebo přepíše ten první. MySQL umí obojí.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:74e2:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
David
~ Anonymní uživatel
164 příspěvků
24. 5. 2018   #10
-
0
-

Dáváš do value id záznamu?

Ano, dávám, ale stále to píše chybu (Array to string conversion)

Select ve formuláři vypadá takto:

echo "Typ výstražníku: <select name=\"vystrazniky[]\" method=\"get\"" . $radek['id_vystrazniku']."\" multiple />";
if($vysledek_vystrazniky = mysql_query($sql_vystrazniky)) {
while ($radek_vystrazniky = mysql_fetch_array($vysledek_vystrazniky)) {
    echo "<option value='" . $radek_vystrazniky['id_vystrazniku'] . "'>" . $radek_vystrazniky['oznaceni_vystrazniku'] . "</option>";
}
}
echo "</select><br />";
Nahlásit jako SPAM
IP: 188.116.67.–
David
~ Anonymní uživatel
164 příspěvků
24. 5. 2018   #11
-
0
-

#9 Kit
Děkuji za radu, zkusím to upravit.

Nahlásit jako SPAM
IP: 188.116.67.–
gna
~ Anonymní uživatel
687 příspěvků
24. 5. 2018   #12
-
0
-

#10 David
Tak tam, kde to píše asi děláš to, co se tam píše.

Pokud máš option takhle, tak by ti to mělo posílat ta čísla z value. Nechápu pak, co myslíš tím, že nechceš vkládat řetězce.

V tom selectu máš zase blbě uvozovky a method tam nemá co dělat. Podívej se na zdroják té stránky.

Typ výstražníku: <select name="vystrazniky[]" method="get"cislo" multiple />  <-- co to tam je?
Nahlásit jako SPAM
IP: 213.211.51.–
MilanL+1
Věrný člen
25. 5. 2018   #13
-
0
-

#9 Kit
jde také o to když se výstražník změní na jiný, tak aby tam nazůstával i ten starý

Nahlásit jako SPAM
IP: 185.112.167.–
peter
~ Anonymní uživatel
3368 příspěvků
25. 5. 2018   #14
-
0
-

Mozna by bylo jednodussi, kdyby jsi sem dal link na stranku a link na php kod te stranky. Podle toho, co jsem ted precetl, tam mas tale spoustu chyb.

Php generuje html, html umi precist www prohlizec.
Www prohlizec ma moznost Zobrazit zdrojovy kod stranky.
Html kod stranky je mozne nechat zkontrolovat validatorem.
Kdyz mas spatne html kod, pak nema smysl zabyvat se php kodem. Nejdriv se musis naucit spravne napsat html kod. Mit tam jen to, co tam ma byt. Po te muzes resit nejake slozitosti, jako propojovani selectu a podobne.

Nahlásit jako SPAM
IP: 2001:718:2601:258:49f:73e...–
peter
~ Anonymní uživatel
3368 příspěvků
25. 5. 2018   #15
-
0
-

"Tak tam, kde to píše asi děláš to, co se tam píše."
Hadam, ze gna tou poznamkou myslel to, ze se stale bavime o jakemsi fiktivnim kodu. Ktery mas nekde ty, ale my tvuj disk nemame nasdileny. Ja to vzdy prirovnavam k autu ve tve garazi a mechanik ve sve dilne. On ti po telefonu nedokaze rici, co mas s autem spatne, potrebuje se na nej podivat.

Nahlásit jako SPAM
IP: 2001:718:2601:258:49f:73e...–
David_10
Duch
25. 5. 2018   #16
-
0
-

Předně děkuji za pomoc, jsem začátečník v PHP. Aktuálně pracuji na hlavní tabulce (ZELEZNICNI_PREJEZDY) a aktualizačním formuláři.

http://projekt.vsps-su.cz/ita15/ita15krnavekd/ASW/zaverecna_prace/databaze.php?id=default

Dělám to částečně jako středoškolský projekt, ale dále to chci využít v rámci svého koníčku. Zadání ze školy bylo dost osekané a to by mě moc nebavilo...

Zde je PHP kód:

<?php

$id = $_POST["id"];
$cislo = $_POST["cislo"];
$sirka = $_POST["sirka"];
$delka = $_POST["delka"];
$rok_rekonstrukce = $_POST["rok_rekonstrukce"];
$foto = $_POST["foto"];
$PZZ = $_POST["PZZ"];
$obec = $_POST["obec"];
$silnice = $_POST["silnice"];
if(IsSet($_POST["vystrazniky"])) {
    $vystrazniky_vyber = implode(', ', $_POST["vystrazniky"]);
}

include("pripojeni.php");

if($rok_rekonstrukce != '' or $rok_rekonstrukce != null) {
$sql = "UPDATE ZELEZNICNI_PREJEZDY SET cislo_prejezdu='$cislo', zemepisna_sirka='$sirka', zemepisna_delka='$delka', rok_rekonstrukce='$rok_rekonstrukce', foto='$foto', ZELEZNICNI_PREJEZDY.id_PZZ='$PZZ', ZELEZNICNI_PREJEZDY.id_obce='$obec', ZELEZNICNI_PREJEZDY.id_silnice='$silnice' WHERE ZELEZNICNI_PREJEZDY.id_prejezdu='$id'"; 
}
else {
$sql = "UPDATE ZELEZNICNI_PREJEZDY SET cislo_prejezdu='$cislo', zemepisna_sirka='$sirka', zemepisna_delka='$delka', rok_rekonstrukce=null, foto='$foto', ZELEZNICNI_PREJEZDY.id_PZZ='$PZZ', ZELEZNICNI_PREJEZDY.id_obce='$obec', ZELEZNICNI_PREJEZDY.id_silnice='$silnice' WHERE ZELEZNICNI_PREJEZDY.id_prejezdu='$id'"; 
}

$sql = "UPDATE ZELEZNICNI_PREJEZDY, PREJEZDY_VYSTRAZNIKY SET cislo_prejezdu='$cislo', zemepisna_sirka='$sirka', zemepisna_delka='$delka', foto='$foto', ZELEZNICNI_PREJEZDY.id_PZZ='$PZZ', ZELEZNICNI_PREJEZDY.id_obce='$obec', ZELEZNICNI_PREJEZDY.id_silnice='$silnice' WHERE ZELEZNICNI_PREJEZDY.id_prejezdu='$id'"; 

if($rok_rekonstrukce != '' or $rok_rekonstrukce != null) {
$sql_rok = "UPDATE ZELEZNICNI_PREJEZDY SET rok_rekonstrukce='$rok_rekonstrukce' WHERE ZELEZNICNI_PREJEZDY.id_prejezdu='$id'";
}
else {
$sql_rok = "UPDATE ZELEZNICNI_PREJEZDY SET rok_rekonstrukce=null WHERE ZELEZNICNI_PREJEZDY.id_prejezdu='$id'";
}
if(IsSet($vystrazniky_vyber)) {
    $vystrazniky[] = explode(', ', $vystrazniky_vyber);
}
$sql_prejezdy_vystrazniky_smazat = "DELETE FROM PREJEZDY_VYSTRAZNIKY WHERE id_prejezdu='$id'";

if (IsSet($vystrazniky))
 {
    foreach($vystrazniky AS $id_vystrazniku) {
        $sql_prejezdy_vystrazniky = "INSERT INTO PREJEZDY_VYSTRAZNIKY (id_prejezdu, id_vystrazniku) VALUES ('$id', '$id_vystrazniku'[\"id_vystrazniku\"])";
        mysql_query($sql_prejezdy_vystrazniky);
    }
    if (mysql_query($sql) && mysql_query($sql_rok) && mysql_query($sql_prejezdy_vystrazniky_smazat)) {
    echo "<br>Aktualizace proběhla úspěšně."; }
    else {
    echo "<br>Aktualizace neproběhla úspěšně."; }
}
else {
    if (mysql_query($sql) && mysql_query($sql_rok)) {
    echo "<br>Aktualizace proběhla úspěšně."; }
    else {
    echo "<br>Aktualizace neproběhla úspěšně.";
    echo $id . "\r\n";
    echo $cislo . "\r\n";
    echo $sirka . "\r\n";
    echo $delka . "\r\n";
    echo $rok_rekonstrukce . "\r\n";
    echo $foto . "\r\n";
    echo $PZZ . "\r\n";
    echo $obec . "\r\n";
    echo $silnice . "\r\n";
     }
}


?>
Nahlásit jako SPAM
IP: 188.116.67.–
gna
~ Anonymní uživatel
687 příspěvků
25. 5. 2018   #17
-
0
-

Tu konverzi pole na řetězec máš tady.

('$id', '$id_vystrazniku'[\"id_vystrazniku\"])

Kdyby jsi chtěl chtěl hodnotu z pole, tak by to šlo napsat jako

... '{$pole['klic']}' ...

Ale ty tam chceš $id_vystrazniku, tak to tak napiš.

... '$id_vystrazniku' ...

Z toho update vyhoď tu vazební tabulku. Nic tam nevážeš. Prostě uprav data přejezdu v jeho tabulce a doplň vazby v té vazební tabulce.

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
687 příspěvků
25. 5. 2018   #18
-
0
-

A ještě jsem zapomněl napsat proč je to pole.

Takovéhle přiřazení přidává položky do pole.

$vystrazniky[] = explode(', ', $vystrazniky_vyber);

Takže v poli $vystrazniky máš jednu položku, která je taky pole. Vyhoď ty závorky []. Celkově nevidím důvod to prohánět přes implode-explode.

Nahlásit jako SPAM
IP: 213.211.51.–
David_10
Duch
28. 5. 2018   #19
-
0
-

Velice vám děkuji za veškerou vaši pomoc. Speciál dík pro gna, díky Tvým posledním radám jsem to spatlal dohromady a vše funguje, jak má    Pár věcí mě ještě potrápilo, práce do školy je hotová, ale budu na tom dělat dál   . Až budu v koncích, přijdu zas pro radu. Mějte se   

Nahlásit jako SPAM
IP: 188.116.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 389 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032018 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý