Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Nepochopitelný whitespace ničí celý layout

Aktivity
Avatar
FastNode
Tvůrce
Avatar
FastNode:19.9.2013 21:49

Ze všeho nejdřív chci omluvit za špagety. Mám pro to důvod.

A teď k věci. Z ničeho nic se mi na stránce objevila mezera, která mi kompletně ničí layout. Nechápu kde se bere (viz. zdroják a obrázky) a zoufale prosím znalce o pomoc:

index.php
      <!-- = KONEC MENU = -->
      <!-- = START OBSAH = -->
      <div id="content">
        <h2><?=$title?></h2>
        <div id="padder">
<?
  include $include;
  echo "\n"; // <<== Tímhle to není
?>

        </div>
      </div>
      <!-- = KONEC OBSAH = -->
      <div class="cleaner"></div>
    </div>
inkludovaný soubor
<?
  if(pre(7)) echo '<p><a class="edit new" href="#">Přidat nový příspěvek</a></p>';
  $db_link = db_connect();
  if(isset($_POST['title'])&&isset($_POST['atext']))
  {
    if(isset($_POST['delete']))
      db_query('DELETE',null,'articles','aid='.$_POST['aid']);
    else
      if(is_numeric($_POST['aid']))
        db_query('UPDATE',array('title'=>$_POST['title'],'content'=>$_POST['atext'],'edited'=>$_SESSION['nick']),'articles','aid='.$_POST['aid']);
      else
        db_query('INSERT',array('title'=>$_POST['title'],'content'=>$_POST['atext'],'author'=>$_SESSION['nick'],'time'=>strftime('%Y-%m-%d %H:%M:%S', time())),'articles');
  }
  $db_result = db_getdata('value','settings',false,'SID=1');
  $db_line = db_getdata('*','articles',false,'aid=0');
  echo '<article style="width:500px">';
  if(pre(7))
    echo '<a class="edit 0 ebtn " href="#">Upravit</a>';
  echo '
  <h3>'.$db_line['title'].'</h3>
  <div class="text">
    <p>'.$db_line['content'].'</p>
  </div>
</article>
  ';
?>
<div class="spacer"></div>
<article style="width:210px">
  <h3>Průměrné zkušenosti</h3>

/* atd... */

Editováno 19.9.2013 21:52
 
Odpovědět
19.9.2013 21:49
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na FastNode
Petr Nymsa:19.9.2013 21:59

Nevím jaký důvod máš ke "spaghetti-code". V PHP tolik nedělám, takže moc neporadím ... ale to tvoje je téměř nečitelný kód...

Nahoru Odpovědět
19.9.2013 21:59
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Filip Pýrek
Tvůrce
Avatar
Filip Pýrek:19.9.2013 22:00

Vlož odkaz na web nebo co css-float?

Editováno 19.9.2013 22:00
Nahoru Odpovědět
19.9.2013 22:00
„The best way to predict the future is to invent it.“ — Alan Kay
Avatar
FastNode
Tvůrce
Avatar
Odpovídá na Petr Nymsa
FastNode:19.9.2013 22:02

Já vím, objektovou verzi dělám taky, ale tohle má přednost...

 
Nahoru Odpovědět
19.9.2013 22:02
Avatar
Kit
Tvůrce
Avatar
Odpovídá na FastNode
Kit:19.9.2013 22:06

Vůbec se mi v tom nechce hrabat. Jen s hrůzou domýšlím, co asi dělají řádky

db_query('DELETE',null,'articles','aid='.$_POST['aid']);
db_getdata('value','settings',false,'SID=1');

apod.

Nahoru Odpovědět
19.9.2013 22:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na FastNode
Petr Nymsa:19.9.2013 22:09

Ve FF to funguje korektně. Bude problém v CSS ;) A tuhle hrůzu jsi ani ukazovat nemusel :)

Nahoru Odpovědět
19.9.2013 22:09
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na FastNode
Honza Bittner:19.9.2013 22:11

chyba je asi v <div id="padder">
http://prntscr.com/1s9hi7

Editováno 19.9.2013 22:12
Nahoru Odpovědět
19.9.2013 22:11
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
FastNode
Tvůrce
Avatar
FastNode:19.9.2013 22:40

Děkuji za rychlé reakce. Já vím že je to humus, ale mám pro to důvod. Tak se omlouvám za šok.

Chybu už jsem našel. Vznikla editací stejného souboru v Debianu a ve Windows, kódování se změnilo na UTF-8 BOM. Změna kódování vše vrátila zpátky.

 
Nahoru Odpovědět
19.9.2013 22:40
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na FastNode
David Hartinger:20.9.2013 9:07

A jaký máš přesně důvod k tomu mít v kódu SQL injekce?

Nahoru Odpovědět
20.9.2013 9:07
You are the greatest project you will ever work on.
Avatar
FastNode
Tvůrce
Avatar
Odpovídá na David Hartinger
FastNode:20.9.2013 10:52

SQLi mám v části aplikace, kam mají přístup pouze tři lidi, které znám, zbytek mám ošetřený strip_tags a addslashes.

Důvodem ke špagetám je dlouhá doba vývoje. Články o OOP jsem si dočetl teprve nedávno a když jsem ostatním oznámil, že web budu dělat už podruhé od znova ještě dalšího půl roku, jsem se rozhodl docvakat tuhle špagetovou verzi, co nejdříve vystavit a pustit se do OOP.

 
Nahoru Odpovědět
20.9.2013 10:52
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:20.9.2013 10:54

Pokud používáš addslashes, tak to ošetřené nemáš, protože ten to neošetřuje. SQL injekce je nebezpečná všude, je jedno že si myslíš, že k tomu není přístup. A hlavně je na hodinu času to opravit.

Nahoru Odpovědět
20.9.2013 10:54
You are the greatest project you will ever work on.
Avatar
jan.vencl
Tvůrce
Avatar
Odpovídá na FastNode
jan.vencl:21.9.2013 9:10

Ahoj, byl jsem v podobné situaci jako ty. Dodělával jsem jednu věc protože oop jsem uměl jen základy, ale upřímně ti radím, všeho nech , zkoukni sdracův seriál o mvc, přečti nějaké články o OOP, session injekci, sql injekci a budeš šťastnej že jsi to udělal. Já teď lituju 9-10 měsíců kdy jsem psal špagetovej kód.

 
Nahoru Odpovědět
21.9.2013 9:10
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:21.9.2013 9:18

Souhlasím skoro se vším, kromě té hodiny. Vyměnit addslashes za mysql_real_es­cape_string je práce na pár sekund až minut.

Nahoru Odpovědět
21.9.2013 9:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:21.9.2013 9:36

To jo, ale v tom kódu je i:

db_query('DELETE',null,'articles','aid='.$_POST['aid']);
:D
Nahoru Odpovědět
21.9.2013 9:36
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:21.9.2013 9:46

Na tento nesmysl jsem upozornil výše. Nevím, co lidi vede k tomu používat takovou slátaninu místo byť stále zastaralého, ale daleko přehlednějšího

mysql_query("DELETE FROM articles WHERE aid=" . (int)$_POST['aid']);
Nahoru Odpovědět
21.9.2013 9:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:21.9.2013 9:54

Třeba na insert je ta metoda super, můžu tam předat rovnou pole z postu. Na delete ji také nechápu :)

Nahoru Odpovědět
21.9.2013 9:54
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:21.9.2013 9:58

To je nějaký framework? Něco podobného jsem našel v Drupalu, ale mělo to jiné pořadí parametrů.

Nahoru Odpovědět
21.9.2013 9:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:21.9.2013 10:11

Když už bych nějaký takový framework dělal, asi bych šel jinou cestou:

db_insert('articles', array('title' => $_POST['title']));
db_select('articles', '*', array('aid' => $_POST['aid']));
db_delete('articles', array('aid' => $_POST['aid']));
db_update('articles', array('title' => $_POST['title'], array('aid' => $_POST['aid']));
Editováno 21.9.2013 10:12
Nahoru Odpovědět
21.9.2013 10:11
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
FastNode
Tvůrce
Avatar
Odpovídá na Kit
FastNode:21.9.2013 18:34

Mám to tak kvůli ošetření MySQL chyb, nebavilo mě pokaždé psát "or die(db_error(mys­ql_error()))"

Ale souhlasím, je to prasárna. Články už přečtené mám, teď musím celý web navrhnout na papír a pak začnu psát.

A framework to opravdu není.

 
Nahoru Odpovědět
21.9.2013 18:34
Avatar
Kit
Tvůrce
Avatar
Odpovídá na FastNode
Kit:21.9.2013 18:38

K čemu je dobré to "or die(..."? Nikdy to nepoužívám.

Nahoru Odpovědět
21.9.2013 18:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
FastNode
Tvůrce
Avatar
Odpovídá na Kit
FastNode:21.9.2013 18:40

Při MySQL chybě zastaví skript a vykoná kód v závorkách: buď vypíše text nebo spustí fuknci.

 
Nahoru Odpovědět
21.9.2013 18:40
Avatar
Kit
Tvůrce
Avatar
Odpovídá na FastNode
Kit:21.9.2013 18:46

Není jednodušší vyskočit z bloku nebo funkce a zpracovat to standardně jako chybu, případně se z ní zotavit? To kvůli tomu ukončíš celý rozpracovaný skript?

Nahoru Odpovědět
21.9.2013 18:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
FastNode
Tvůrce
Avatar
Odpovídá na Kit
FastNode:21.9.2013 18:54

To nevadí, pokud vznikne chyba, přesměruju uživatele headerem na chybovou stránku.

Ale asi máš pravdu, nemá smysl abych se tu hádal s někým chytřejším a zkušenějším.

 
Nahoru Odpovědět
21.9.2013 18:54
Avatar
Kit
Tvůrce
Avatar
Odpovídá na FastNode
Kit:21.9.2013 19:02

Nauč se používat PDO a práci s výjimkami. V PHP 5.5 byla funkce mysql_query() odstraněna.

Nahoru Odpovědět
21.9.2013 19:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
FastNode
Tvůrce
Avatar
Odpovídá na Kit
FastNode:21.9.2013 23:03

Ok, díky za info. Jak jsem psal, tohle během krátké doby dodělám a vrhnu se na objekty.

 
Nahoru Odpovědět
21.9.2013 23:03
Avatar
Kit
Tvůrce
Avatar
Odpovídá na FastNode
Kit:22.9.2013 9:34

Když objekty, tak třeba takto:

$db->insert('articles', array('title' => $_POST['title']));
$db->select('articles', '*', array('aid' => $_POST['aid']));
$db->delete('articles', array('aid' => $_POST['aid']));
$db->update('articles', array('title' => $_POST['title'], array('aid' => $_POST['aid']));

ale stejně mám nejraději klasické SQL dotazy, které mi připadají elegantnější

$db->query("INSERT INTO articles (title) VALUES (?)", array($_POST['title']));
$db->queryOne("SELECT * FROM articles WHERE aid=?", array($id));
$db->queryAll("SELECT * FROM articles");
$db->query("DELETE FROM articles WHERE aid=?", array($_POST['aid']));
$db->query("UPDATE articles SET title=? WHERE aid=?", array($_POST['title'], $_POST['aid']));

atd. Stačí si jen trochu upravit PDO viz návod na devbooku.

Nahoru Odpovědět
22.9.2013 9:34
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 27 zpráv z 27.