Autor Zpráva
TomasRe
Profil
Dobrý den,
můžete prosím někdo poradit, kde mám chybu. S databázemi jsem úplný začátečník. Mám kód:

$vysledek = mysql_query("SELECT * FROM uzivatele ORDER BY id");

while ($zaznam = mysql_fetch_array($vysledek)): 

echo "<form action=\"\">";
echo "prezdivka: <input name=\"nova_prezdivka\" value=\"".$zaznam["prezdivka"]."\"> <a href=\"".$zmena."\">změnit</a> <a href=\"".$smazat."\">smazat</a><br>";
echo "email: <input name=\"email\" value=\"".$zaznam["email"]."\"><br>";
echo "</form><br>";
endwhile;

$zmena=mysql_query("UPDATE `uzivatele` SET `prezdivka` = $nova_prezdivka WHERE id = ".(int) $_GET['id'], $spojeni);
$smazat=mysql_query("DELETE FROM `uzivatele` WHERE id = ".(int) $_GET['id'], $spojeni);

Tlačítko změnit by mělo změnit pouze přezdívku, ale tlačítko smazat by mělo smazat celý řádek z tabulky databáze (celého uživatele).
Děkuju moc..
lionel messi
Profil
TomasRe:
1. Nepoužívaj pri spracovaní dát z formulára $nova_prezdivka, ale $_GET['novaprezdivka'] (register_globals je predvolene vypnuté a zapínať túto direktívu nie je dobrý nápad z hľadiska bezpečnosti).
2. Uvedenú premennú vkladáš do dotazu bez ošetrenia voči SQL Injection, čo ak si niekto vyberie prezývku McDonald's, prípadne ešte horšie ' OR 1=1?
3. Správne by úprava prezývky mala byť takto:
$zmena=mysql_query("UPDATE `uzivatele` SET `prezdivka` = '". mysql_real_escape_string($_GET['nova_prezdivka']) ."' WHERE id = ".(int) $_GET['id'], $spojeni);
4. Rozšírenie mysql, je zastaralé, odporúčam mysqli.
TomasRe
Profil
lionel messi:
Bohužel to hlásí stále stejnou chybu:
Warning: mysql_query() expects parameter 2 to be resource, null given in /data/web/virtuals/89668/virtual/www/pages/test.php on line 19
lionel messi
Profil
TomasRe:
on line 19
V kóde [#1] riadok 19 ani nemáš. Skús si v dotazoch vypísať chyby:
$zmena=mysql_query("UPDATE `uzivatele` SET `prezdivka` = $nova_prezdivka WHERE id = ".(int) $_GET['id'], $spojeni) or die(mysql_error());

(obdobne o riadok nižšie v druhom dotaze) a daj vedieť, čo to vypísalo.
TomasRe
Profil
lionel messi:
Vypisuje to tu chybu, kterou jsem psal - Warning: mysql_query() expects parameter 2..... Při vložení mysql_error to vypíše Query was empty
mimochodec
Profil
lionel messi:
SET `prezdivka` = $nova_prezdivka

Nechybí tam apostrofy?
TomasRe
Profil
mimochodec:
To je beze změny :-(
lionel messi
Profil
mimochodec:
lionel messi:
„SET `prezdivka` = $nova_prezdivka“
>
Nechybí tam apostrofy?
Chýbajú, upozorňoval som na to už v [#2].
TomasRe
Profil
lionel messi:
To bohužel stále vůbec neřeší chybu - stále beze změny.
mimochodec
Profil
TomasRe:
Slož si ten dotaz do nějaké proměnné, tzn. $q= "UPDATE .... a pak si ho vypiš echem, ať vidíš, co do té databáze posíláš. Co ti to vypíše, ukaž tady.
TomasRe
Profil
mimochodec:
Nevypíše bohužel vůbec nic. Ještě mě napadlo - co by mělo být v proměnné $spojeni?
mimochodec
Profil
TomasRe:
Nevypíše bohužel vůbec nic.

Tak děláš něco špatně. Po $q= "UPDATE ...." ti echo $q; ten dotaz musí vypsat.
TomasRe
Profil
mimochodec:
To je dost možné. V tomhle opravdu moc neumím... psal jsem $q= "UPDATE `uzivatele` SET `prezdivka` = $nova_prezdivka WHERE id = ".(int) $_GET['id'];
mimochodec
Profil
TomasRe:
To je dost možné. V tomhle opravdu moc neumím

Takže vidím dvě věci. Jednak ti tam chybí ty apostrofy, o kterých ti tady od 20:51 meldujeme. A za druhé to, že se ti ten dotaz nevypíše, znamená, že ta část programu vůbec neproběhne. Projdi si všechny podmínky a zjisti si, co se opravdu děje a kudy program běží.

Ten druhý parametr mysql_query nepoužívám, tak přesně neporadím. Každopádně někde nad tímhle musíš mít nějaké připojení k databázi. Já na začátku každého index.php includuju soubor, kde mám mj.

  define("SQL_HOST","xx");
  define("SQL_DBNAME","xx");
  define("SQL_USERNAME","xx");
  define("SQL_PASSWORD","xx");

  mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD);
  mysql_select_db(SQL_DBNAME);

  mysql_query("SET character_set_results=utf8");
  mysql_query("SET character_set_connection=utf8");
  mysql_query("SET character_set_client=utf8");
  mysql_query("SET names='utf8';");

Když potom někde použiju mysql_query, žádné připojení nezadávám.
TomasRe
Profil
mimochodec:
Apostrofy jsem tam dal již před tím, jen jsem to teď špatně napsal... Na začátku mám vložení souboru s připojením. To proběhne v pořádku - vypíše data. Jinak tam žádné jiné podmínky nejsou. Tohle je celý kód:

<?
$vysledek = mysql_query("SELECT * FROM uzivatele ORDER BY id");

while ($zaznam = mysql_fetch_array($vysledek)): 

echo "<form action=\"\">";
echo "prezdivka: <input name=\"nova_prezdivka\" value=\"".$zaznam["prezdivka"]."\"> <a href=\"".$zmena."\">změnit</a> <a href=\"".$smazat."\">smazat</a><br>";
echo "email: <input name=\"email\" value=\"".$zaznam["email"]."\"><br>";
echo "heslo: <input name=\"heslo\" value=\"".$zaznam["heslo"]."\"><br>";
echo "</form><br>";
endwhile;

$zmena=mysql_query("UPDATE `uzivatele` „SET `prezdivka` = $nova_prezdivka“ WHERE id = ".(int) $_GET['id'], $uzivatele);
$smazat=mysql_query("DELETE FROM `uzivatele` WHERE id = ".(int) $_GET['id'], $spojeni);

?>
Alphard
Profil
TomasRe [#3]:
Ta chyba mluví o 2. parametru, což je odkaz konkrétní připojení k databázi, který vrátí funkce mysql_connect(). Ve vašem případě bude lepší ten parametr zcela vynechat, pak se použije poslední sestavené spojení (tak jako na řádku 2).

PS: kdybyste použil třeba dibi, pracovalo by se s databází líp.
mimochodec
Profil
TomasRe:
Vidím, že ty uvozovky moc nezvládáš. V php ti ušetří dost práce, když budeš používat apostrof, tzn.

echo "email: <input name='email' value='".$zaznam["email"]."'><br>";

V dotazu pro ten update to je dost krkolomnost. Použij toto:

  $q = "UPDATE uzivatele SET prezdivka = '".$nova_prezdivka."' WHERE id = ".(int)$_GET['id'];
  $zmena=mysql_query($q);

Kromě toho doufám, že to tam máš takhle seskládáno jen pro ten účel, abys to ukázal tady. Pokud ne, uniká mi smysl toho, že chceš zároveň vypsat formulář pro editaci, zároveň data updatovat (přičemž ještě nejsou odeslána) a zároveň toho člověka mažeš.

K tomu druhému kódu: samozřejmě si můžeš to $q = odpustit a ten příkaz dát rovnou do mysql_query(). Takhle to dělám právě z toho důvodu, abych si ten dotaz mohl jednoduše a rychle vypsat v případě, že něco skřípe.
TomasRe
Profil
mimochodec:
upravil jsem to a už to chybu nehlásí. Upravil jsem i uvozovky na apostrofy (děkuju za radu), je to opravdu přehlednější. Ale tlačítka nereagují. Respektive se stránka zaktualizuje a zůstane beze změny.
Smysl by měl být, že by to takto byla vytvořena jednoduchá administrace, kde by se měnily texty. S možností mazat, upravovat texty.
mimochodec
Profil
TomasRe:

Jak zpracovat data odeslaná z formuláře: Možnosti PHP » Zpracování formulářů
Důrazně doporučuji to, co tam je zmíněno jako "Modernější přístup".

(otázka směrem nahoru: nemohl by někdo postrčit Yuhůa k tomu, aby tu stránku updatoval?)
TomasRe
Profil
mimochodec:
Tak to asi bude fungovat, ale to pak bude jedna stranka pro smazání, jedna pro úpravu a jedna pro přidání...
Alphard
Profil
mimochodec:
nemohl by někdo postrčit Yuhůa k tomu, aby tu stránku updatoval?
Jestli pravidelně čteš diskusi, víš, že takové snahy (i s nabídkou pomoci diskutujících) jsou nejen u PHP článků, ale kvůli časovému vytížení to není tak snadné.
Věci týkající se PHP na původním jpw snad někdy nahradí modernější pehapko, konkrétně formuláře na Základní kurz 12: Předání dat na server. Máš-li návrhy k obsahu pehapka, vyjádři se v patřičných sekcích, nebo něco napiš :-), tam je změna mnohem jednodušší, spravuje to Joker a přístup ke článkům mám třeba i já.

[#17]:
Tady se jaksi vypařilo escapování $nova_prezdivka.

TomasRe:
ale to pak bude jedna stranka pro smazání, jedna pro úpravu a jedna pro přidání...
Ano. Samozřejmě může být víc akcí v jednom souboru, ale je třeba podmínkou odlišit, jaká se má zrovna provést.
mimochodec
Profil
Alphard:
Tady se jaksi vypařilo escapování $nova_prezdivka.

Pořád jsem se jaksi zdráhal přijmout to, že escapování není někde nad tím kódem, stejně jako načtení hodnoty z GETu. Ale vypadá to tak.
Za konkrétní odkaz pehapko dík. Není to poprvé, co jsem chtěl odkázat na nějaký příklad a nevěděl jsem kam.
TomasRe
Profil
Vyřešeno. Kdyby někdo hledal:

<?php
$vysledek = mysql_query("SELECT * FROM uzivatele ORDER BY id");
while ($zaznam = mysql_fetch_array($vysledek)): 
echo "<form action='testa' method='post'>";
echo "<input type='hidden' name='id' value='".$zaznam["id"]."'>";
echo "prezdivka: <input name='prezdivka' value='".$zaznam["prezdivka"]."'><br>";
echo "email: <input name='email' value='".$zaznam["email"]."'><br>";
echo "<input type='submit' name='tlacitko' value='Upravit'>";
echo "<input type='submit' name='tlacitko2' value='Smazat'>";
echo "</form><br>";
endwhile;
?>

<?php
// UPRAVIT ZÁZNAM

if(isset($_GET["id"])) {
  $id=$_GET["id"];
  if(!$data=mysql_query("SELECT * FROM uzivatele WHERE id=$id"))
    {echo "Nepodařilo se načíst záznam k editaci";}
  else {
    $zaznam=mysql_fetch_array($data);
    $prezdivka=$zaznam["prezdivka"];
    $email=$zaznam["email"];
    }
}
elseif(isset($_POST["tlacitko"])) {
  $id=$_POST["id"];
  $prezdivka=$_POST["prezdivka"];
  $email=$_POST["email"];
  $kontrola=true;
  if($_POST["prezdivka"]=="") {echo "<p class=\"diky\">Nezadána přezdívka</p>"; $kontrola=false;}
  if($_POST["email"]=="") {echo "<p class=\"diky\">Nebyl zadán email</p>"; $kontrola=false;} 
  if($kontrola) { 
    if(!$data=mysql_query("UPDATE uzivatele SET prezdivka='$prezdivka', email='$email', WHERE id=$id"))
      {echo "<p class=\"diky\">Změna dat nebyla uložena, opakujte prosím později.</p>";}
    else
      {echo "<p class=\"diky\">Změny byly uloženy.</p>";}
  }
}

// SMAZÁNÍ ZÁZNAMU

if(isset($_POST["tlacitko2"])) {
  $id=$_POST["id"];
  $kontrola=true;
  if($kontrola) { 
    if(!$data=mysql_query("DELETE FROM uzivatele WHERE id=$id"))
      {echo "<p class=\"diky\">Změna dat nebyla uložena, opakujte prosím později.</p>";}
    else
      {echo "<p class=\"diky\">Změny byly uloženy.</p>";}
  }
}
 
?>

<h1>Výpis uživatelů</h1>

<?php
$vysledek = mysql_query("SELECT * FROM uzivatele ORDER BY id");
while ($zaznam = mysql_fetch_array($vysledek)): 
echo "<p>";
echo $zaznam["prezdivka"].'<br>';
echo $zaznam["email"].'<br>';
echo "</p>";
endwhile;
?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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