Autor Zpráva
Brouzdalek
Profil
Potřeboval bych vytvořit script, který mi provede update všech vypsaných záznamů z databáze. Mám formulář, kde je:
<?
$connection1 = MySQL_Connect("localhost", "root", "root");
$connection2 = MySQL_Select_DB("test");
MySQL_Query("SET NAMES 'cp1250';");
$sql1 = MySQL_Query("SELECT * FROM tabulka");

$i = 0;
while ($sql = MySQL_Fetch_Array($sql1)) {
?>

<tr height="30px">
 <td width="30%" align="center"><input type="text" name="ID" class="pole" value="<? echo $sql["ID"]; ?>"></td>
 <td width="30%" align="center"><b><input type="text" name="jmeno" class="pole" value="<? echo $sql["jmeno"]; >"></b></td>
 <td width="30%" align="center"><b><input type="text" name="prijmeni" class="pole" value="<? echo $sql["prijmeni"]; ?>"></b></td>
</tr>

...

Cyklus mi záznamy vypíše, já v nich provedu změny a ty teď potřebuju uložit do db. Zkoušel jsem různé věci, bylo mi doporučováno FOREACH. Tuhle fci. umím použít, ale nevím, jak ji mám zapracovat do tohoto problému.

Víte si s tím někdo rady ? Předem všem moc díky...
Akacko
Profil
No za prvé jména inputů musíš napsat takto:
name="ID[]"
name="jmeno[]"
name="prijmeni[]"

Pote za předpokladu že imputy máš v tagu form odešleš upravena data. Potom to pomoci foreach zpracuješ

foreach($_POST["id "] as $key => $id)
{
    mysql_query("UPDATE tab SET jmeno=\"".$_POST["jmeno"][$key]."\" WHERE id=\"".$id."\"");
}


Doufám že jsem to napsal dobře.
Joker
Profil
Za prvé by to měl být formulář.
Potom může být buď každý řádek zvláštní formulář s odesílacím tlačítkem a skript by vybral parametry a poslal příkaz UPDATE do databáze.

Další možnost je udělat celý ten výpis jako jeden formulář, pak by šlo měnit více položek najednou. Pak je ale potřeba rozlišit jednotlivé položky, tj. nejspíš udělat je jako pole.
Brouzdalek
Profil
to Akacko:

Hláška:
Invalid argument supplied for foreach()
...

...ale jinak to vypadá dobře :)
DJ Miky
Profil
$_POST["id "]

Odstraň tu mezeru:

$_POST["id"]
Brouzdalek
Profil
to Joker:

to mám (samozřejmě s cyklem 'while'):
<FORM action="<? echo $PHP_SELF; ?>" method="post">
...
<tr height="30px">
 <td width="30%" align="center"><input type="text" name="ID[]" class="pole" value="<? echo $sql["ID"]; ?>"></td>
 <td width="30%" align="center"><b><input type="text" name="jmeno[]" class="pole" value="<? echo $sql["jmeno"]; ?>"></b></td>
 <td width="30%" align="center"><b><input type="text" name="prijmeni[]" class="pole" value="<? echo $sql["prijmeni"]; ?>"></b></td>
</tr>
...
</FORM>
Akacko
Profil
Brouzdalek
kontroluješ nějak odesílání formuláře? Resp. máš to foreach v podmínce?

Popř sem hoď zdroják.

edit jo to asi bude tou mezerou. Sry. Překlep :)
Brouzdalek
Profil
to DJ Miky:

bez mezery to taky nejde ...

doplnil jsem to a výsledek toho příkazu je:

foreach($_POST["id"] as $key => $id)
{
    mysql_query("UPDATE tab SET ID=\"".$_POST["ID"][$key]."\", jmeno=\"".$_POST["jmeno"][$key]."\", 
    prijmeni=\"".$_POST["prijmeni"][$key]."\"");
}



no a celý formulář vypadá teď takto:
<FORM action="<? echo $PHP_SELF; ?>">
<?
$connection1 = MySQL_Connect("localhost", "root", "root");
$connection2 = MySQL_Select_DB("test");
MySQL_Query("SET NAMES 'cp1250';");
$sql1 = MySQL_Query("SELECT * FROM tabulka");
while ($sql = MySQL_Fetch_Array($sql1)) {
?>

<tr height="30px">
 <td width="30%" align="center"><input type="text" name="ID[]" class="pole" value="<? echo $sql["ID"]; ?>"></td>
 <td width="30%" align="center"><b><input type="text" name="jmeno[]" class="pole" value="<? echo $sql["jmeno"]; ?>"></b></td>
 <td width="30%" align="center"><b><input type="text" name="prijmeni[]" class="pole" value="<? echo $sql["prijmeni"]; ?>"></b></td>
</tr>
<?
} 
?>
<div align="center"><input type="submit" value="Uložit změny" class="pole"></div><br />
</FORM>
Brouzdalek
Profil
to Akacko:

nekontroluju, tohle není nějaký projekt, pouze se to učím a narazil jsem na to, ale v blízké době se mi to bude hodit... :)

bohužel, nic jsem o tomhle nenašel, v manuálu o tom moc není... :(
Akacko
Profil
 mysql_query("UPDATE tab SET ID=\"".$_POST["ID"][$key]."\", jmeno=\"".$_POST["jmeno"][$key]."\", 
    prijmeni=\"".$_POST["prijmeni"][$key]."\"");


proč upravuješ i ID? Imho nesmysl. Spíše dej podmínku WHERE ID=.....

a toto strč do podmínky, kde ověříš zda se odeslal formulář
if ($_POST["send"])
{
foreach($_POST["id"] as $key => $id)
{
    mysql_query("UPDATE tab SET ID=\"".$_POST["ID"][$key]."\", jmeno=\"".$_POST["jmeno"][$key]."\", 
    prijmeni=\"".$_POST["prijmeni"][$key]."\"");
}
}

nezapomeň změnit input
<input type="submit" value="Uložit změny" name="send" class="pole">
Brouzdalek
Profil
Akacko

Zkopíroval jsem tvůj kód a: Bohužel, hlásí mi to pořád stejnou chybu, aktualizuju jen 2 kategorie, ale nic... No jo, ID nemůžu měnit, protože ho využívá foreach, co ... :)

Kód:
<body>
<div align="center"><h1>Editace zobrazených záznamů</h1></div>
<table border="0" align="center">
<FORM action="<? echo $PHP_SELF; ?>" method="post">

<?
$connection1 = MySQL_Connect("localhost", "root", "root");
$connection2 = MySQL_Select_DB("test");
MySQL_Query("SET NAMES 'cp1250';");
$sql1 = MySQL_Query("SELECT * FROM tabulka");
while ($sql = MySQL_Fetch_Array($sql1)) {
?>

<tr height="30px">
 <td width="30%" align="center"><input type="text" name="ID[]" class="pole" value="<? echo $sql["ID"]; ?>"></td>
 <td width="30%" align="center"><b><input type="text" name="jmeno[]" class="pole" value="<? echo $sql["jmeno"]; ?>"></b></td>
 <td width="30%" align="center"><b><input type="text" name="prijmeni[]" class="pole" value="<? echo $sql["prijmeni"]; ?>"></b></td>
</tr>

<?
} 
?>

<div align="center"><input type="submit" value="Uložit změny" name="send" class="pole"></div><br />
</FORM>

<?
if ($_POST["send"])
 {
  foreach($_POST["id"] as $key => $id)
   {
    mysql_query("UPDATE tabulka SET jmeno=\"".$_POST["jmeno"][$key]."\", 
    prijmeni=\"".$_POST["prijmeni"][$key]."\"");
   }
 }
?>
</body>
Měsíček
Profil
Tohle neřeší problém, ale je to správně? value="<? echo $sql["jmeno"]; ?>" ? přece by neměly být vnořené uvozovky ne? ( value="<?php echo $sql['jmeno'];?>"), ale nevím to jistě.
Akacko
Profil
no jo ono asi totiž není $_POST["id"] ale $_POST["ID"] ne?
Brouzdalek
Profil
Měsíček

Tak to nevím, v tomhle se moc nevyznám, ale mě to funguje, repsektive data se mi vypíšou :)
Akacko
Profil
Měsíček
může to tak být
Brouzdalek
Profil
Akacko

foreach($_POST["ID"] as $key => $id)


jj, já používám v tabulce v mysql velké: ID
takhle ? to se mi ale přepíšou záznamy dané kategorie - tzn. pokud změním u někoho příjmení, tak se 'to nové' příjmení zapíše ke všem záznamům....
Akacko
Profil
Brouzdalek
no právě proto musíš použit WHERE
mysql_query("UPDATE tabulka SET jmeno=\"".$_POST["jmeno"][$key]."\", 
    prijmeni=\"".$_POST["prijmeni"][$key]."\" WHERE ID=\"".$_POST["ID"][$key]."\"");
Brouzdalek
Profil
Akacko
Tak můžeme slavit ! Funguje to !!! Moc Ti děkuji, seš šikovnej, než bych tohle vymyslel...

Ještě jedna drobná moucha. Úspěšně to aktualizuje záznamyv databázi, ale ne na stránce, tzn. že tu stránka musím znova načíst pomocí F5. Je na tohle nějaký fígl ? Hodilo by se třeba použít Header("Location: xxx"); ?
Akacko
Profil
Jo to se na to používá, před headrem ale nesmí být žádný jiný výstup (rozuměj text ... ani mezera). proto to foreach s podmínkou dej nad while.
Brouzdalek
Profil
Akacko

Protože mi to dřív hlásilo chybu, tak jsem se informoval, používám ob_start () a ob_end_flush() - týká se nějakého zásobníku, či co :) Ještě jednou díky moc za pomoc ! Ahoj..

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0