Autor Zpráva
Martin02
Profil
Dobrý den, na mém webu se nespustí jedna stránka kvůly těmto pár řádkům. Poradíte, prosím, jestli v nich není něco špatně?
<?php
  if(isset($_POST['date'])) {
    $dir = "./images/touha";
    move_uploaded_file($_FILES['upload']['tmp_name'], $dir. '/'. $_FILES['upload']['name']);
    $dir_sql = "./images/touha/$_FILES['upload']['name']";
    mysql_query("INSERT INTO touha(datum, adresa) VALUES($_POST['date'], $dir_sql)", $db);
    echo "<p>Soubor byl nahrán na server.</p>";
  }
?>
Joker
Profil
Martin02:
se nespustí jedna stránka kvůly těmto pár řádkům
Jak vypadá, že „se nespustí“?
Chybová hláška, neočekávané chování?
Taps
Profil
Martin02:
zkus menší upravu
mysql_query("INSERT INTO touha(datum, adresa) VALUES('".$_POST['date']."', '$dir_sql')", $db);
Joker
Profil
Ještě jedna poznámka:
mysql_query("INSERT INTO touha(datum, adresa) VALUES('".$_POST['date']."', '$dir_sql')", $db);
Fuj. Heslo: SQL injection.

Pokud by například sloupec adresa měl nastavené že je unikátní, mohl bych si jako uživatel-záškodník s tou tabulkou docela pohrát, když bych si do políčka "date" vložil třeba:
0-0-0','adresa záznamu který chci změnit') ON DUPLICATE KEY UPDATE SET nějaký sloupec=nějaká hodnota --
Martin02
Profil
Joker:
"Jak vypadá, že „se nespustí“?
Chybová hláška, neočekávané chování?"

Prostě je bílá obrazovka a když dám zobrazit zdrojový kód, nic se nestane. Mám to na ic.cz, mám zaplí .htaccess na zobrazování php chyb, ale nic to neohlašuje.

Taps:
Díky, to jsem zkusil, ale bohužel nic se nezměnilo.

Kdyžtak bych poprosil o úplně jednoduchý formulář, kam uživatel napíše datum, a adresu obrázku. Po odeslání se obrázek nahraje na server do určité složky, to zadané datum se odešle do databáze, a také se do databáze odešle název nahraného obrázku. Prosím, jestli by mi to nemohl někdo napsat, protože v mém kódu tohoto procesu je asi něco špatně a ani po dlouhém hledání chyb jsem nic nenašel.
jenikkozak
Profil
Martin02:
Prosím, jestli by mi to nemohl někdo napsat, protože v mém kódu tohoto procesu je asi něco špatně a ani po dlouhém hledání chyb jsem nic nenašel.
Vždyť to je jednoduchý kód s formuláři. Ukaž ten svůj kód, najdeme ti chybu.
Martin02
Profil
Soubor admin_touha.php:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=windows-1250">
    <title>Statistiky cechu Isengard - Shakes&Fidget</title>
  </head>
  <body>
    <form action="./admin_touha.php" method="post" enctype="multipart/form-data">
      Datum: <input type="text" name="date" size="20"><br />
      Adresa: <input type="file" name="upload">
      <input type="submit" name="submit" value="Odeslat">
    </form>
  </body>
</html>

<?php
  $db = mysql_connect('xxx', 'xxx', 'xxx') or die (mysql_error($db));
  mysql_select_db('xxx', $db) or die (mysql_error($db));
  
  if(isset($_POST['submit'])) {
    $dir = "./images/touha";
    move_uploaded_file($_FILES['upload']['tmp_name'], $dir. '/'. $_FILES['upload']['name']);
    mysql_query("INSERT INTO touha(datum, adresa) VALUES($_POST['date'], $_FILES['upload']['name'])", $db);
    echo "<p>Soubor byl nahrán na server.</p>";
  }
?>


Hlásí mi to chybu: Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/free/ic.cz/i/isengard-cech/root/www/admin_touha.php on line 35
Na řádku 35 je: mysql_query("INSERT INTO touha(datum, adresa) VALUES($_POST['date'], $_FILES['upload']['name'])", $db);

Neuvádím celý kód, ještě před tímto mám opatření, aby to neviděl ten kdo k tomu nemá mít přítup, ale v tom chyba určitě není.
jenikkozak
Profil
Martin02:
Takže jsem měl pravdu. Ve formuláři chyba není. Kdyby ti ho někdo napsal, vůbec by ti nepomohl. Když máš chybu na 35. řádku, proč chceš, aby ti někdo opravoval formulář, který máš na 20. řádku?
Hodnoty se v tom dotazu nahrazují proměnnými už v PHP. Proto se podívej na Tapsovu úpravu v 3. příspěvku. Řetězce vkládané do databáze musíš mít ohraničené pomocí apostrofů.
Martin02
Profil
To jsem zkusil, ale bohužel opět nic.
Trochu se si s tím pohrál a dost to předělal, ovšem pořád to nefunguje.

Stránky jsou zde: isengard-cech.ic.cz Heslo je vždy: admin
index.php:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=windows-1250">
    <title>Statistiky cechu Isengard - Shakes&Fidget</title>
  </head>
  <body>
    <center>
    <div id="form">
      <h2>Pokud jste členem cechu Isengard a neznáte <br />heslo, zeptejte se vůdce nebo důstojníků.</h2>
      <form action="list.php" method="post">
        <input type="password" name="pass" size="20"><br />
        <input type="submit" value="Přihlásit">
      </form>
      <?php
        session_start();
        echo $_SESSION['wrong'];
      ?>
    </div>
    </center>
  </body>
</html>


list.php:
<?php
  session_start();
  if($_SESSION['access'] != 1) {
    if(isset($_POST['pass'])) {
    if($_POST['pass'] != "admin") {  
      $_SESSION['wrong'] = "<p>Špatné heslo!</p>";
      header('Location: http://isengard-cech.ic.cz/index.php');
      exit();
    } else if($_POST['pass'] == "admin") {
      $_SESSION['access'] = 1;
    }
    }
  }
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=windows-1250">
    <title>Statistiky cechu Isengard - Shakes&Fidget</title>
  </head>
  <body>
    <center>
    <?php
      if(isset($_GET['ul'])) {
        switch($_GET['ul']) {
          case "utok":
            include "./includes/utok.php";
            break;
          case "obrana":
            include "./includes/obrana.php";
            break;
          case "touha":
            include "./includes/touha.php";
            break;
          case "logout":
            session_unset();
            header('Location: http://isengard-cech.ic.cz/index.php');
            break;
        }
      } else {
        include "./includes/uvod.php";
      }
    ?>
    </center>
  </body>
</html>


uvod.php:
<h4><a href="./list.php?ul=utok">Útoky</a> &nbsp; | &nbsp; <a href="./list.php?ul=obrana">Obrany</a> &nbsp; | &nbsp; <a href="./list.php?ul=touha">Touha</a></h4>
<hr />
<h4><a href="./list.php?ul=logout">Odhlásit</a></h4>


Nebudu zobrazovat všechny soubory (utok.php, touha.php, obrana.php), v podstatě jsou všechny stejné.
utok.php:
<?php
  $db = mysql_connect('xxx', 'xxx', 'xxx') or die (mysql_error($db));
  mysql_select_db('xxx', $db) or die (mysql_error($db));
  $result = mysql_query("SELECT * FROM utok", $db);
  
  echo "<table border=\"0\">";
  while($řádek = mysql_fetch_assoc($result)) {
    extract($řádek);
    echo "<tr>
            <td>$date</td>
          </tr>
          <tr>
            <td><img src=\"./images/utok/$img\"></td>
          </tr>";
  }
  echo "</table>";
?>
<hr />
<form action="./includes/utok_admin.php" method="post" enctype="multipart/form-data">
  <table border="0">
    <tr>
      <td>Datum pořízení obrázku: </td>
      <td><input type="text" name="date" size="20" value="Zadejte datum a čas." id="form_utok" onclick="document.getElementById('form_utok').value = '';"></td>
    </tr>
    <tr>
      <td>Zadejte adresu obrázku: </td>
      <td><input type="file" name="utok_img" size="20"></td>
    </tr>
    <tr>
      <td></td>
      <td><input type="submit" value="Nahrát obrázek na server!"></td>
    </tr>
  </table>
</form>
<?php
  echo $_SESSION['upload_utok'];
?>


utok_admin.php:
<?php
  $db = mysql_connect('xxx', 'xxx', 'xxx') or die (mysql_error($db));
  mysql_select_db('xxx', $db) or die (mysql_error($db));
  
    $dir = "./images/utok";
    move_uploaded_file($_FILES['utok_img']['tmp_name'], $dir. '/'. $_FILES['utok_img']['name']);
    mysql_query("INSERT INTO utok(date, img) VALUES('".$_POST['date']."', '".$_FILES['utok_img']['name']."')", $db);
  
  $_SESSION['upload_utok'] = "Soubor byl nahrán na server!";
  header('Location: http://isengard-cech.ic.cz/list.php?ul=utok');
?>


Je to dlouhý kód, ale prosím pročtěte si ho a najděte chybu. Předem všem moc děkuji za odpovědi..
o_O
Profil
Chyba je určitě v tom, že zapínáte session až po nějakém výstupu, viz index.php. (Samozřejmě se nejedná o chybu kterou hledáte)

Nechápu, o co jde. Stránka nevrací žádné chybové hlášky.

Další chyba:
- V souboru utok_admin.php vytváříte session, ale nikde je nezapínáte (session_start();)
YoSarin
Profil
Martin02:
A co za chybu to píše teď? Ve kterém souboru?
Martin02
Profil
o_O:
Tvé chyby jsem opravil, nic se ale nezměnilo.

YoSarin:
.htaccess má zapnuté pro zobrazování chyb, ale nic to nehlásí (můžeš se podívat).


Když vyplním pole pro datum a čas, vaberu soubor a odešlu, vše se chová, jak by mělo. Napíše to i, že soubor byl nahrán, ale jak v databázi, tak ve složce nic není.
Davex
Profil
Martin02:
Teď zrovna nikomu na IC nefunguje upload, takže bych s řešením zatím počkal. Viz upload obrazkov.
peta
Profil
Zkus tento script, ale na ic.cz uz nic nemam, s nima byli jen problemy.
http://peter-mlich.wz.cz/web/php/pr/upload/upl_manager.txt
patlal
Profil
peta:
Ten Váš skript je děravý jak sviňa. Nikdo ten péťův skript nepoužívejte!
Martin02
Profil
Davex:
Dobrá, tak jsem tedy nahrál stránky na server php5.cz (www).
Pokrok je, že se do SQL zapíšou příslušná data o obrázku, ale obrázek nikde.

V souboru utok_admin.php jsem pro test zrušil přesměrovávání na stránku, abych se podíval na případná oznámení chyb. Píše to toto: Warning: move_uploaded_file(./images/utok/terrain.png): failed to open stream: No such file or directory in /www/sites/4/site5914/public_html/includes/utok_admin.php on line 7 Warning: move_uploaded_file(): Unable to move '/www/sites/4/site5914/tmp/phpJCj7fM' to './images/utok/terrain.png' in /www/sites/4/site5914/public_html/includes/utok_admin.php on line 7
Na řádku 7 v tom souboru leží: move_uploaded_file($_FILES['utok_img']['tmp_name'], $dir. '/'. $_FILES['utok_img']['name']);

Možná to bude problém v nastavení práv. Prosím napište mi někdo kde všude mám změnit práva a na jaké, aby šel nahrát soubor.
děkuji
Davex
Profil
Jsou tam dvě varování, která mají stejnou příčinu.
Warning: move_uploaded_file(./images/utok/terrain.png): failed to open stream: No such file or directory in /www/sites/4/site5914/public_html/includes/utok_admin.php on line 7
Warning: move_uploaded_file(): Unable to move '/www/sites/4/site5914/tmp/phpJCj7fM' to './images/utok/terrain.png' in /www/sites/4/site5914/public_html/includes/utok_admin.php on line 7

Neexistuje adresář /www/sites/4/site5914/public_html/includes/images/utok/.

Prosím napište mi někdo kde všude mám změnit práva a na jaké, aby šel nahrát soubor.
Když na tomto adresáři nastavíš práva 0777, tak do něj půjde zapisovat komukoliv, i PHP běžícímu jako modul Apache. Na některých serverech to není nutné a zápis je možný i bez toho. Záleží na konfiguraci webserveru a způsobu spuštění PHP.
Martin02
Profil
Davex:
Děkuji.

Problém vyřešen! :)

Ještě bych potřeboval vědět toto:
Zde je kód ze stránky utok.php
<?php
  $db = mysql_connect('xx', 'xx', 'xx') or die (mysql_error($db));
  mysql_select_db('xx', $db) or die (mysql_error($db));
  $result_date = mysql_query("SELECT date FROM utok", $db);
  
  echo "<table border=\"0\">";
  echo "<tr>";
  while($řádek = mysql_fetch_assoc($result_date)) {
    extract($řádek);
    echo "<td>$date</td>";
  }
  echo "</tr>
        <tr>";
  $result_img = mysql_query("SELECT img FROM utok", $db);
  while($řádek2 = mysql_fetch_assoc($result_img)) {
    extract($řádek2);
    echo "<td><img src=\"../images/utok/$img\"></td>";
  }
  echo "</tr>";
  echo "</table>";
?>
<hr />
<form action="./includes/utok_admin.php" method="post" enctype="multipart/form-data">
  <table border="0">
    <tr>
      <td>Datum pořízení obrázku: </td>
      <td><i><input type="text" name="date" size="25" style="color: DimGray;" value="př.: 20.8.2011 9:36" id="form" onclick="document.getElementById('form').value = '';"></i></td>
    </tr>
    <tr>
      <td>Zadejte adresu obrázku: </td>
      <td><input type="file" name="utok_img" size="25"></td>
    </tr>
    <tr>
      <td></td>
      <td><input type="submit" value="Nahrát obrázek na server!"></td>
    </tr>
  </table>
</form>
<?php
  echo $_SESSION['upload_utok'];
?>

Chtěl jsem se zeptat, jak docílit toho, že se jako první bude zobrazovat obrázek, který má v databázi nejvyšší ID?
A zadruhé, jak docílit toho, že když by mělo být na jedné stránce zobrazeno víc než x obrázků, pod tabulkou se vytvoří odkaz na další stránku?

děkuji
pcmanik
Profil
Martin02:
1. Pouzi mysql funkciu MAX()
2. Hladaj php strankovanie
Martin02
Profil
Funkci MAX() vůbec neznám, tak jsem o ní něco hledal, ale vždyť ta může jen zobrazit řádek s nejvyším id, ale co dál? Pořád nechápu jak použít.
pcmanik
Profil
Martin02:
Prepac, zle som si precital tvoju otazku, staci ti pouzit ORDER BY id DESC
To ti zoradi id-cka od najvacsieho po najmensie.
Martin02
Profil
pcmanik:
dobře, děkuji

Předchozí problémi jsou tedy vyřešenu, už to je skoro hotové, ale pořád to není vše:
je na tomhle řádku něco v nepořádku?
mysql_query("DELETE FROM obrana WHERE img = $_POST['del_name']", $db);


Když najedu na stránku kde je tento kód:
<?php
  session_start();
  $db = mysql_connect('xx', 'xx', 'xx') or die (mysql_error($db));
  mysql_select_db('xx', $db) or die (mysql_error($db));
?>
<center>
<form action="./obrana_del.php" method="post">
  Název souboru ke smazání: <br /> 
  <input type="text" name="del_name" size="20">
  <input type="submit" value="smazat">
</form>
</center>
<?php
  if(isset($_POST['del_name'])) {
    mysql_query("DELETE FROM obrana WHERE img = $_POST['del_name']", $db);
    unlink("../images/obrana/$_POST['del_name']");
    
    $_SESSION['del_img'] = "Soubor $_POST['del_name'] byl úspěšně smazán.";
    header('Location: http://sfgame.php5.cz/list.php?ul=obrana');
  }
?>

Vypíše mi to chybu: Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /www/sites/4/site5914/public_html/includes/obrana_del.php on line 15
Řádek 15 je ten na který sem se ptal, jestli něco není špatně.

děkuji
Segi_L
Profil
Martin02:
Buď
mysql_query("DELETE FROM obrana WHERE img = $_POST[del_name]", $db);

nebo
mysql_query("DELETE FROM obrana WHERE img = ".$_POST['del_name'], $db);


Ale kvoli SQL injection ani jeden zápis nie je správny.

Túto chybu si mal i v príspevku o niečo vyššie. Nepoučil si sa?
Martin02
Profil
Segi_L:
jj, v tom byl problém.
Poprvé jsem špatně přečetl tvůj příspěvěk a myslel jsem, že druhé řešení je správně, ale pak jsem si uvědomil, co jsi tím myslel a vše niný bez problémů funguje :)

Děkuji mockrát všem za odpovědi
Tori
Profil
V dotazu chybí uvozovky okolo názvu souboru.

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:

0