Autor | Zpráva | ||
---|---|---|---|
mirio Profil |
#1 · Zasláno: 10. 1. 2007, 15:05:13
Ahoj,
chtěl jsem se zeptat, jak pomocí fce v PHP co nejlépe ověřit funkčnost odkazu, který někdo zadal, aby se dostal někam na mých stránkách. Popis: Mám stránku clanek.php, ze které se návštěvníkovi vygeneruje požadovaný článek pomocí ?id=nějaké_číslo_článku_z_databáze. Jenže, když se zadá id, které není v databázi, vyhodí to pouze MySQL chybu a to já nechci. Stejně tak, když se nezadá id žádné nebo se zadá za "?" úplný nesmysl. A to taky nechci. V DB mám sloupec, do kterého ukládám linky k článkům "na tvrdo", tak mě napadlo to nějak porovnávat s $_SERVER['REQUEST_URI'], a pokud by žádný záznam nevyhovoval poslal bych návštěvníka na 404-ku. Jenže nevím, jak na to... Nebo existuje nějaký lepší způsob (jako že asi jo!). Děkuju za odpovědi. Mirio |
||
Celebi Profil |
#2 · Zasláno: 10. 1. 2007, 15:13:04
Já bych to řešil:
if (mysql_num_rows($dotaz)==0) Header("Location: error404.php"); |
||
mirio Profil |
#3 · Zasláno: 10. 1. 2007, 15:16:54
Ano, já to tak taky zkoušel, jenže jsem nepřišel na ten zprávný dotaz a jsem už z toho tak vygumovaný, že otravuju tady na fóru... :-((
Poradíte? |
||
k Profil * |
#4 · Zasláno: 10. 1. 2007, 15:43:11
spravny dotaz?
select `id`, `rewrite_url` from tabulka ?? |
||
mirio Profil |
#5 · Zasláno: 10. 1. 2007, 15:57:49
Ahoj k! :-)
Měl jsem to takhle, což je nesmysl a teď s tím nemůžu hnout. function overeni(){ $dotaz = mysql_query("Select * from clanky"); if (mysql_num_rows($dotaz)==0) Header("Location: error404.php"); else ""; } |
||
nightfish Profil |
#6 · Zasláno: 10. 1. 2007, 16:16:26
$dotaz = mysql_query("select * from clanky where idClanku = $idClanku");
kde $idClanku je proměnná, kterou dostaneš přes $_GET['id'] jinak doporučuju použít spíš select count(*) from... a pak testovat, jestli mysql_result($dotaz,0,0) == "0" nebo ne... |
||
k Profil * |
#7 · Zasláno: 10. 1. 2007, 16:29:08
mirio
My se nejak zname? Myslel jsi to dobre jen jsi mel spatne ten dotaz. Udelej to podle nightfishe. |
||
mirio Profil |
#8 · Zasláno: 10. 1. 2007, 18:49:36 · Upravil/a: mirio
k: Ne, jen už jste mi s nightfishem (ahoj nightfishi! :-) ) jednou pomohli, tak jsem rád, že vás tu vidím.
Mno, zpět k tomu, co děláme. :-) Myslím, že už to funguje ale mám problém s headers already sent a vůbec nevím proč. Tohle... <?php include "./.../pripojeni_k_db.php"; // soubor obsahuje přímo kód pro připojení k databázi function overeni(){ $a="http://neco.cz".$_SERVER['REQUEST_URI']; $dotaz = mysql_num_rows(mysql_query("SELECT 1 FROM clanky WHERE permalink LIKE '$a' LIMIT 1")); if ($dotaz==0) Header("Location: error404.php"); else ""; } ...je celý kód úplně od začátku a já nevím, co mi tam může generovat nějaký výstup a házet ten error s hlavičkama. |
||
Alphard Profil |
#9 · Zasláno: 10. 1. 2007, 19:25:35
include "./.../pripojeni_k_db.php"
co ty ... ? je celý kód úplně od začátku a já nevím, co mi tam může generovat nějaký výstup chyba čehokoliv, např. Parse error ... Header("Location: error404.php"); nahraď např.: echo "0 záznamů "; a zkontroluj zdroják |
||
mirio Profil |
#10 · Zasláno: 10. 1. 2007, 19:40:52 · Upravil/a: mirio
Alphard:
Ty tečky v kódu nejsou, je tam cesta k souboru, ale já ho měnil, tak se mi ta nová cesta nechtěla psát. Myslím, že tam žádný error není, hodí to rovnou tohle: Warning: Cannot modify header information - headers already sent by (output started at /mnt/data/accounts/m/mirio/data/www/clanek.php:4) in /mnt/data/accounts/m/mirio/data/www/skripty/clanek/vypis_clanku.php on line 6 A když nahradím Header tím echem, normálně to proběhne a vypíše se 0 záznamů. Nejde to nějak obejít? Tohle je poslední věc, kterou potřebuji rozchodit, ať konečně můžu spustit své stránky a nevím jak na to, sakra. |
||
mirio Profil |
#11 · Zasláno: 10. 1. 2007, 23:00:16 · Upravil/a: mirio
Ještě pro upřesnění. Vím, že problém s hlavičkami se tady řeší pořád, ale já fakt nechápu, kde je v mém skriptu nějaký výstup. Snažím se to pochopit, tak snad nikoho nepohoršuju. Jestli ano, omlouvám se.
|
||
YoSarin Profil |
#12 · Zasláno: 11. 1. 2007, 02:24:27
mirio
a neobsahuje ten includovaný soubor nějaký (jakýkoli) výpis? Třeba jen nějaký html komentář jestli se připojení povedlo nebo ne... |
||
krteczek Profil |
#13 · Zasláno: 11. 1. 2007, 08:53:52
mirio: i odřádkování před <?php je bráno jako html výstup (odešlou se hlavičky): => uplně první znak (posloupnost znaků) na stránce musí být <?php ( funguje i <? ale tuto starou notaci nepoužívejte)
dalším způsobem jak se bránit těmto header errorům může být použití fce pro buferování výstupu: <?php Někdo řekne že je to jako jít s kanonem na vrabce, ale je to také jedno z možných řešení. krteczek |
||
nightfish Profil |
#14 · Zasláno: 11. 1. 2007, 09:28:19
mirio
(output started at /mnt/data/accounts/m/mirio/data/www/clanek.php:4) poděl se s námi o 10 prvních řádků skriptu clanek.php |
||
mirio Profil |
#15 · Zasláno: 11. 1. 2007, 09:38:54
Tak už to mám. Ale přiznám se - já prostě nepřišel na to, co mi ten výstup posílá, přestože jsem si přečetl snad všechny thready tady na fóru, které se týkaly headers already sent... :-((
Udělal jsem to nakonec tak, že tu funkci jsem dal úplně mimo ostatní a vložil ji ještě před DOCTYPE. Stydím se, že jsem nepřišel na tu mršku, která výstup posílá... Díky všem! |
||
mirio Profil |
#16 · Zasláno: 11. 1. 2007, 09:41:05
nightfish:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Osobní stránky a weblog</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name='author' content='All: Mirek Hovorka [mirio]; mailto:mirek@hovorka.biz'> <meta name='description' content='Stránky o mě a mých zájmech.'> <meta name='keywords' content='blog,pc,it,počítače,software,hardware,mirek,bohumír,hovorka,m irio'> <meta name="dc.language" content="cs"> <meta name="geo.country" content="CZ"> <meta http-equiv="revisit-after" content="1 days"> Podělil jsem se o 11. :-) |
||
tiso Profil |
#17 · Zasláno: 11. 1. 2007, 09:44:03
mirio
Zrejme nevieš čo je výstup, to čo si napísal výstup je... |
||
nightfish Profil |
#18 · Zasláno: 11. 1. 2007, 09:44:54
no tak jestli se ti tenhle soubor includuje ještě před tím, než pošleš hlavičky, tak se není čemu divit... je to samý výstup...
|
||
mirio Profil |
#19 · Zasláno: 11. 1. 2007, 10:20:01 · Upravil/a: mirio
Ne ne ne, tohle je normální výpis html, includuju až v jeho těle.
|
||
nightfish Profil |
#20 · Zasláno: 11. 1. 2007, 10:25:49
mirio
no a to je ten problém... Header() posíláš v nějakém z těch includovaných souborů a tedy až po zahájení výstupu (který je v tomto konkrétním případě realizován odesláním DOCTYPE) |
||
mirio Profil |
#21 · Zasláno: 11. 1. 2007, 10:28:49
AHA!!! To jsem to ale pitomec. *stydlivý smajlík*
Díky, to mě vůbec nenapadlo. |
||
Anonymní Profil * |
#22 · Zasláno: 11. 1. 2007, 10:28:58
mirio to je úplně jedno, header musí být úplně před všim, takže ještě před doctype
|
||
mirio Profil |
#23 · Zasláno: 11. 1. 2007, 10:47:13
tiso:
Máš pravdu, tohle jsem nevěděl. Anonymní: Taky tak. Jak už jsem napsal, má chyba. Prostě mi to nedošlo. Omlouvám se. |
||
Časová prodleva: 17 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0