Autor Zpráva
Truuhlik
Profil
Zdravím,

takže řeším problém - chci vytvořit jednoduchý rs (jenom přidávání, upravování a mazání novinek)

jak přidávat to chápu

Soubor novinky.txt
Novinka||Text novinky
Novinka2||Text novinky 2



Soubor view.php
<?php
$radku = file("novinky.txt");

foreach($radku as $key => $val){
$data[$key] = explode("||", $val);
}

echo "<table>";

for($k=0; $k<sizeof($radku); $k++){
echo "<tr><td>".$data[$k][0]."</td></tr>"; atd atd tohle ještě chápu
}

echo "</table>";
?>


ale pak je tady ten problém, že nevím jak prostě vytáhnout jenom jeden řádek a otevřít si ho ve vytvořeném formuláři
prostě input na název, na samotný text novinky nebo podle vytáhnout ten řádek a ten smazat - nevím jestli to chápete, ale nevím jak jinak bych to napísal

nevěděl by někdo jak efektivně a hlavně jednoduše na tento problém?
Taps
Profil
Truuhlik:
Pokud je v prvním sloupečku umístěn název článku který bude mít unikátní hodnotu, tak projdeš soubor pomocí foreach a pomocí funkce strpos si vytáhneš daný řádek souboru. Smazání řádku je na stejný způsob změna je jen v tom že místo strpos použiješ funkci unset, která ti smaže příslušná data.

Pokud vytváříš vlastní rs tak ti doporučuji nastudovat si práci s databází. Ukládání článků a jakákoliv manipulace je pak mnohem snažší.
Truuhlik
Profil
Taps:
s databází umím to jo, SELECT, UPDATE, DELETE akorát snažím se vytvořit něco co by právě mysql nepotřebovalo, aby to bylo ještě líp přenosný,

chtěl jsem se zeptat, nenapsal bys mi jak by to mělo vypadat? není to o tom, že bych nezkoušel to rozhodně ne, jen nevím jak na to - kdybych to dělal přes databázi tak je to o mnoho jednodušší, zapíšu do databáze a vytáhnu to z ní selectem, seřadím jak chci a ještě si určím kolik toho chci vypsat, ale tady jsem v koncích
mylan
Profil
Ideálne na začiatok riadku priradiť ešte aj id (buď budeš id generovať sám a vždy novému riadku priradzovať id o 1 vyššie, ako má posledný riadok, alebo v krajnom prípade môžeš ako id použiť aj timestamp. Základom je však dosiahnuť jedinečnosti id). Tvoja file db bude teda vyzerať takto:

Súbor novinky.txt
1||Novinka||Text novinky
2||Novinka2||Text novinky2
3||Novinka3||Text novinky3


K jednotlivé riadku potom pristúpiš takto (neriešim ošetrenie na rôzne chybové hlášky, to už snáď zvládneš sám):

Súbor view.php?id=2
<?php
  if (isset($_GET['id']) && is_numeric($_GET['id'])) {
  
    $file = file('./novinky.txt');
    
    foreach ($file as $single_line) {
    
      $data = explode('||', $single_line);
      if ($data[0] != $_GET['id']) continue;
      else {
        $title = $data[1];
        $text = $data[2];
      }
      
    }
    
    echo '<strong>' . $title . ':</strong> ' . $text;
    
  }
?>
Truuhlik
Profil
mylan:
jo tohle se mi zamlouvá, dokonce se to obešlo i bez té mojí proměnné
 $key 
,
tak mě ještě ale napadá jak tady nahradit funkci UPDATE a DELETE - řekněme, že si vygeneruju stránku,
na které budu mít vypsány v jednom sloupečku název novinky ve druhém bude button upravit a ve třetím smazat

po kliknutí na příslušné tlačítko bych nechal vyvolat funkci, pomocí toho idčka bych věděl kterou chci editovat nebo smazat, ale teď jak na to, když ten soubor novinky.txt bude mít dejme tomu jenom 30 řádků jsem z toho fakt blbej

to mám zase projet ten soubor foreach() nebo jak?
mylan
Profil
áno, zase prejdeš cyklom foreach. Napríklad zmazanie novinky bude vyzerať takto (pokiaľ prebieha cez formulár, ktorý sa odosiela metódou post a odosiela sa v ňom skrytá hodnota "action" s hodnotou "delete" a id novinky.):
<?php
  if (isset($_POST['action']) && $_POST['action'] == 'delete' && isset($_POST['id']) && is_numeric($_POST['id'])) {
  
    $file = file('./novinky.txt');
    $lines = '';
    
    foreach ($file as $single_line) {
    
      $data = explode('||', $single_line);
      if ($data[0] == $_POST['id']) continue;
      else $lines .= $single_line;
      
    }
    
    file_put_contents('./novinky.txt', $lines, LOCK_EX);
    
    header('location: ./?msg=deleted'); // presmerovanie na stránku s hláškou o úspešnom vykonaní akcie
    exit;
    
  }
?>


Sám vytváram CMS založený na flat file databáze: MNews CMS. Je však už viac zložitejší, ako ty požaduješ (okrem základnej práce s článkami je tam už práca s komentármi, kategóriami, užívateľmi atď). Avšak dá sa použiť aj na takéto jednoduché akcie (nevyžaduje vyplnenie kategórie ani dlhého článku). Ak aj nie, môžeš sa aspoň inšpirovať :)
Truuhlik
Profil
takže večer jsem teda zkoušel projít celý výtvor znovu - zapisování ok, vypsání z db taky ok, otevření na úpravu taky ok, smazání taky ok ale zastavím se u toho otevření pro úpravu - všechno se mi otevře ve formuláři který odesílám přes post dále už kód, ale prostě se mi to nezaktualizuje - pořád zůstává všechno stejné - nevíš kde dělám chybu?

$id = $_POST['id'];
$nazev = $_POST['nazev'];
$obsah = $_POST['obsah'];

$soubor = file("novinky.txt");
$lines = "$id||$nazev||$obsah";

foreach($soubor as $single_line){
$data = explode("||", $single_line);
if($data[0] == $id) continue;
else{$lines .= $single_line;}
}
file_put_contents('novinky.txt, $lines, LOCK_EX);
exit;

Carrot
Profil *
Truuhlik:
1||Novinka||Text novinky
Nebylo by lepší místo této prasečiny použít radši nějaký standardizovaný formát? Například XML?
mylan
Profil
Aj keď ideš na to okľukou, malo by to fungovať, len ti novinku zapíše na začiatok súboru, na úpravu by som použil túto konštrukciu:
<?php

  $file = file('./novinky.txt');
  $lines = '';
  
  foreach ($file as $single_line) {
    
    $data = explode('||', $single_line);
    if ($data[0] == $_POST['id']) $lines .= $_POST['id'] . '||' . $_POST['nazev'] . '||' . $_POST['obsah'];
    else $lines .= $single_line;
      
  }
    
  file_put_contents('./novinky.txt', $lines, LOCK_EX);
?>

Ak to nefunguje, ukáž formulár, ktorým to odosielaš...
Truuhlik
Profil
mylan:
hejky mockrát díky funguje to skvěle

no zkoušel jsem zatím jenom jednoduchý formulář samozřejmě si to ještě doplním o vkládání smajlíků, tagů atd je to jen na ukázku

http://www.zoryo.sweb.cz - ukázka jak to funguje

$radku = file("novinky.txt");

foreach($radku as $single_line){
$data = explode("||", $single_line);
if($data[0] != $id) continue;
else{
$nazev = $data[1];
$obsah = $data[2];

echo "<table>
<form action='?site=save' method='post'>
<tr><td>Přidat novinku:<td><input type='hidden' name='id' value='".$data[0]."'></td></tr>
<tr><td>Název novinky:</td><td><input type='text' name='nazev' size='20' value='$nazev'></td></tr>
<tr><td>Obsah novinky:</td><td><textarea name='obsah' cols='40' rows='6'>".$obsah."</textarea></td></tr>
<tr><td></td><td><input type='submit' value='Upravit novinku'></td></tr>
</form>
</table>";

}
}
Truuhlik
Profil
Carrot:
čoveče proč prasárna? - nechci nic říkat, ale měl by ses mrknout po netu - je dost systémů běžících na této struktuře - mnews, cutenews dokonce tuším že i quick cms - jenom vydolovat z tama ty složité kódy, přitom tady tohle je tak jednoduché a bohatě to postačí na server, kde prostě DB neposkytují
Truuhlik
Profil
ještě jednou díky moc všem
Carrot
Profil *
Truuhlik:
čoveče proč prasárna? - nechci nic říkat, ale měl by ses mrknout po netu - je dost systémů běžících na této struktuře
Pak je navrhovali idioti.
Pokud ukládám data do souborů (proti tomu nic), je velmi rozumné volit existující (a rozšířený) formát namísto bastlení vlastního.
Když bys zvolil jako formát XML, na parsování i vytváření bys mohl v PHP použít desítky nativních a externích tříd. Samotný soubor by pak šel otevřít ve stovce různých programů. Dodržením určité konvence bys jej mohl rovnou použít jako RSS, přidáním XSLT bys ho mohl v Excelu zobrazit jako formátovanou přímo tisknutelnou tabulku.

Všechno prakticky bez práce - stačí jenom nevymýšlet kokotiny.
fopen
Profil *
Carrot
co myslis, pouzit fgetcsv, fputcsv je tiez prasárna? csv format je tiez editovatelny v exceli...
Carrot
Profil *
fopen:
co myslis, pouzit fgetcsv, fputcsv je tiez prasárna
Ne, je to mnohem lepší než vlastní formát. Ale s CSVčkem toho moc nevykouzlíš - je to jenom dvourozměrná tabulka.

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