Egyszerű helyzet, de miért ad hibát?
Sziasztok!
Lett egy pici gondom, eddig egész jól haladtam, viszont gondoltam a későbbi munkám könnyítése miatt megírtam az első functionom. A function működik, a hiba maradt...
Ez a kód:
<?php
function nincs_adat($x){
if(empty($x)){
$x="Nincs adat";
return $x;
break;
}
else{
return $x;
}
}
$file = fopen("animelista.txt","r") or exit("Nem lehet megnitni a fájlt!");
echo('<a href="animeleltar.php">Vissza.</a><br />');
while(!feof($file)) {
$sor = fgets($file);
$tomb = explode(", ", $sor);
$sortomb= array();
for($i=0;$i<count($tomb);$i++){
$sortomb[$i] = $tomb[$i];
}
$mentesiido = nincs_adat($sortomb[4]);
print $sortomb[0].", ".$sortomb[1].", ".$sortomb[2].", ".$sortomb[3].", ".$mentesiido;
echo("<br />");
}
echo('<a href="animeleltar.php">Vissza.</a>');
fclose($file);
?>
A proglémám az, hogy functionba elküldöm a nemlétező változót, és kiadja a hibaüzenetet, ugyanakkor beírja a változóba azt amit szeretnék hogy bent legyen. Ezt hogy tudnám megoldani?
(kezdő programozó vagyok, nagyon kezdő)
Internetre ez nem kerülne fel, ez csak nekem készül itthonra.
Csak hogy értsd: azért nem működött neked, mert a függvénynek értékként adtad át a változót. Azaz, ha nem volt definiálva, akkor már a függvénynek sem tudott mit átadni. Ha az & jelet használod, akkor pointerként adod át a paramétert, azaz nem másolja az értéket, hanem közvetlen a változót adja át, így pedig már működik az isset, hiszen nem kell paraméterátadáskor másolni a nem definiált változót.
Így is lehet, de nem igazán jó megoldás.
Ha azt akarod, hogy csak azok az értékek jelenjenek meg, amik definiálva vannnak, sokkal egyszerűbb így:
foreach($tomb as $value) {
print $value.", ";
}
Mellesleg azt sem értem, minek vágod fel a sort vesszők mentén, ha utána ugyanúgy vesszőkkel írod ki?
A vesszők átmenetileg lettek beletéve, már át van az javítva | jelre. Jelenleg ez még egyáltalán nincs kiforrva, folyamatosan módosítgatom, viszont a php tudásom nagyon kevés. Ez miatt használom pl az if-nek is a hosszabb verzióját, mert azt jelenleg jobban átlátom. Ez a későbbiekben valószínűleg változni fog, viszont jelenleg nekem még így a jobb.
azért akartam functionban ellenőrizni az issetet, mivel lesz majd egy másik php oldal, ahol összegyűjtöm a functionokat, és az oldalak elején majd csak be kell szúrkodni őket. A jelenlegi meg azért "kell", hogy egyrészt gyakoroljak, másrészt meg ezt máshol is fogom alkalmazni (a maszekprogramomon belül), és így egyszerűbb lesz használni, minthogy minden értéknél mindig kiírni (legalábbis most így gondolom).
Jelenleg a txt-ben van Cím, rész, hossz, és módosítási idő oszlop, viszont a módosítási idő nincs mindegyiknél, így ezekhez kellett odaírnia a proginak, hogy "Nincs adat".
És jelenleg azért szedtem szét így szavakra, mert a következő dolog majd egy kereső lesz ezekben, ami csak max a név és cím oszlopban keres, ugyanakkor ki tud írni mindent.
Jelenleg már a kereső részével szenvedek, de majd megoldom valahogy. :)
Azért az elég szégyen, hogy lassan egy napja senki nem tudja megírni mitől dob hibát a függvényed. Bár #6 elég közel járt hozzá, sőt rá is vezethetett volna, ha okos vagy ;)
A sortomb[4] nem létezik, ezért a függvénynek sem adhatod át. Ezt futásidőben ellenőrizd:
$mentesiido = (isset($sortomb[4]) ? $sortomb[4] : "Nincs adat");
Emellett a $sortomb változónak nincs sok értelme, nyugodtan használhatod a $tomb-öt, vagy legalább használhatod így a ciklus helyett:
$sortomb = $tomb;
Ha már fájlban tárolsz adatokat, akkor egyszerűbb lenne csv-ben feldolgozni, vagy xml-ben azokhoz a php kínál beépített parsereket.
Pl: [link]
good luck!
$adat=file("animelista.txt" ,FILE_IGNORE_NEW_LINES );
foreach($adat AS $sor){
$sortomb=explode("," , $sor);
$mentesiido = empty($sortomb[4])?' nincs adat ': $sortomb[4] ;
echo $sortomb[0].", ".$sortomb[1].", ".$sortomb[2].", ".$sortomb[3].", ".$mentesiido ."<br />";
}
Még egy kicsit egyszerűbben:
$adat = file("animelista.txt" , FILE_IGNORE_NEW_LINES);
foreach($adat AS $sor) {
$sortomb = explode("," , $sor);
$sortomb[4] = empty($sortomb[4])?' nincs adat ': $sortomb[4] ;
echo implode(", " , $sortomb) . "<br />";
}
Drone007
Azt tudom, hogy a $sortomb[4] nincs mindig definiálva, a jelenlegi példában az egy mentési időt tartalmaz, ami a date() paranccsal rendeli hozzá az időt. Ezt amit írtál
($mentesiido = (isset($sortomb[4]) ? $sortomb[4] : "Nincs adat"); )
szeretném kiváltani egy függvénnyel, hogy ne adjon hibát. Ezt jelenleg el tudtam érni, a fent említett módszerrel.
Azért kell nekem rá a függvény, mert ugyanazokat a sorokat nem akarok sokszor ismételni, hiába ilyen rövid.
Kedves kérdező, ahogy írtam nem hívhatsz meg egy függvényt egy nem létező változóval. Először validálnod kell a változót, mert különben még a hívási periódus előtt elhasal a program.
Vagyis: az átadott változó validálását nem teheted a függvénybe, mert ha nem létezik akkor nem is adhatod át a függvénynek.
Bocs, de ennél szájbarágósabban már nem tudom leírni :)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!