Autor Zpráva
mirio
Profil
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
Já bych to řešil:
if (mysql_num_rows($dotaz)==0) Header("Location: error404.php");
mirio
Profil
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 *
spravny dotaz?
select `id`, `rewrite_url` from tabulka
??
mirio
Profil
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
$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 *
mirio
My se nejak zname?

Myslel jsi to dobre jen jsi mel spatne ten dotaz. Udelej to podle nightfishe.
mirio
Profil
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
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
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
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
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
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

ob_start();
//jakýkoliv kód včetně includovaného

ob_end_flush();
?>

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
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
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
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
mirio
Zrejme nevieš čo je výstup, to čo si napísal výstup je...
nightfish
Profil
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
Ne ne ne, tohle je normální výpis html, includuju až v jeho těle.
nightfish
Profil
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
AHA!!! To jsem to ale pitomec. *stydlivý smajlík*

Díky, to mě vůbec nenapadlo.
Anonymní
Profil *
mirio to je úplně jedno, header musí být úplně před všim, takže ještě před doctype
mirio
Profil
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.
Toto téma je uzamčeno. Odpověď nelze zaslat.