ugrás a tartalomhoz

Warning: Your script possibly relies on a session side-effect...

chipi · 2007. Ápr. 11. (Sze), 15.59
Sziasztok!
Írtam egy keresést és valamiért ha pontos keresésnél ezt a hibát kapom :(

Warning: Unknown(): Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0
 
1

valamiért

Hojtsy Gábor · 2007. Ápr. 11. (Sze), 16.11
Igen, valamiért ezt a hibát kapod. A kód ismeretében miből tudnánk, hogy miért (azon kívül, hogy a globális változók és a munkamenet változók körül van valami vélt vagy valós hasonlóság)?
2

kód

chipi · 2007. Ápr. 11. (Sze), 18.23

<?php
// keresés
if(isset($_POST["kereses"]))
{
extract($_POST);
$where="WHERE ";
if(isset($_POST["termek_nev"])){
// cégnév
$_POST["termek_nev"];
 $where  .= "termek_nev LIKE '%$termek_nev%'";
								}
// cikkszám
if(isset($_POST["termek_kod"])){
$_POST["termek_kod"];
 $where  .= " AND termek_kod LIKE '%$termek_kod%'";
								}
								// mennyiség
if(isset($_POST["mennyiseg"])){
$_POST["mennyiseg"];
 $where  .= " AND mennyiseg LIKE '%$mennyiseg%'";
								}
// eladás.php
if($_POST["page"]=="eladas"){

if(isset($_POST["vevo"])){
$_POST["vevo"];
 $where  .= " AND megrendelo LIKE '%$vevo%'";
 }
if(isset($_POST["szm"])){
$_POST["szm"];
 $where  .= " AND v_szm LIKE '%$szm%'";
 }
						

// elada.php zárótgaja
}
else{
// termék név
if(isset($_POST["megnevezes"])){
$_POST["megnevezes"];
 $where  .= " AND megnevezes LIKE '%$megnevezes%'";
								}
// datum
if(isset($_POST["datum"])){
$_POST["datum"];
 $where  .= " AND datum LIKE '%$datum%'";
							}
// huf
if(isset($_POST["huf"])){
$_POST["huf"];
 $where  .= " AND huf LIKE '%$huf%'";
						}
// számlaszám
if(isset($_POST["szm"])){
$_POST["szm"];
 $where  .= " AND szm LIKE '%$szm%'";
 }
// euró						
if(isset($_POST["euro"])){
$_POST["euro"];
 $where  .= " AND euro LIKE '%$euro%'";
						}}

$_SESSION["where"]=$where;

// kersés zárótag
}
?>
3

Törhető

janoszen · 2007. Ápr. 11. (Sze), 23.25
Hajjaj, remélem, nincs komoly adat abban az adatbázisban, amelyiken ez fut, mert olyan szépen törhető ez mint a huzat.

Ami a hibát illeti, amiatt figyelmeztet, hogy a $_SESSION['where'] létezik és hogy lehet, hogy a $where-t használod helyette. Bár itt egyértelműen nem ez a helyzet. Ha jól értettem a doksit.

Egyébként valami tervezési hiba lehet, ha session-be szeretnél SQL query-t átadni. Mit szeretnél ezzel pontosan csinálni?
4

értelmetlen

Hojtsy Gábor · 2007. Ápr. 12. (Cs), 10.54
Az ilyen sorok nem "csinálnak" semmit, sok értelmük nincs, azon kívül, hogy a PHP-nek ezt is ki kell értékelnia, aztán el kell dobnia:
<?php
$_POST["termek_nev"];
Ezen kívül (a biztonsági rések mellett, amit már Gábor említett) az extract() ilyen használata nem javallt, mert nem látod, hogy mi jött a kérésből, és mi jött saját változóidból. Az isset()-ben jó, hogy a _POST-ot használod, de a $where-be fűzésnél nem jó, hogy nem ugyanazt használod fel, amit ellenőriztél (ez könnyen két eltérő változó is lehet). Az pedig végképp nem jó, hogy egy az egyben használod a változókat.
5

Talán megvan a hiba?

chipi · 2007. Ápr. 18. (Sze), 22.12
Hát egy kicsit azóta átírtam e sorokat a progiban és most működik rendessen, de ez az üzi akkor is megjelenik, de csak is akkor ha nem talál rakordott a megadott paraméterre a progi, igaz akkor is van érték, de az nulla.
És csak is ekkor jelenik meg a hiba, nem lehet ,hogy a szerveren bekéne kapcsolni ezt a register_globals -t?
6

Bekapcsolni?

janoszen · 2007. Ápr. 19. (Cs), 09.47
Bekapcsolni? Ha arra alapozik a programod, az rég rossz...
7

az okos PHP...

TeeCee · 2007. Ápr. 19. (Cs), 11.22
... :)
Egyszer énis belefutottam ilyenbe. Hogy pontosan mi okozza, nem sikerült megtalálni, viszont úgy vélem okozhatja, hogy a PHP megpróbálja kitalálni, hogy van egy változód, amit megpróbáls register_globals=on-nal és anélkül is elérni. Illeve a kód register_globals=on-ra lett írva.. Ez onnan látszik, hogy van benne egy extract($_POST), talán ez izgatja be a PHP-t, hogy ilyet írjon ki.

Amúgy:

<?php
if(isset($_POST["termek_kod"])){
 $where  .= " AND termek_kod LIKE '%$termek_kod%'";
}
?>
Itt szépen látszik, hogy lusta volt valaki dolgozni ;)
A helyes sor:
$where .= " AND termek_kod LIKE '%'.$_POST['termek_kod']'.%'";

Másik, hogy a $_SESSION["where"]=$where; sor miatt is szólhat, hiszem $where és $_SESSION['where'] is van. ugye register_globals = on esetében a $where automatikusan létrejön. Eleve a $_SESSION['where']-hez fűzd a WHERE stringet!

A biztonságról: mysql_real_escape_string()-en nyomd át az SQL-ben szereplő értékeket.

szerintem, ha a az extract($_POST)-ot kiveszed, már nem fog szólni, igaz, akkor a fent említett módosításokat meg kell csinálnod...

És a bónusz, hogy legközelebb átgondold, hogy mi a jól olvasható és tömör kód, ami ráadásul újra felhasználható is (nem ellenőriztem le, csak leírtam):

<?php
// A 'termek_nev', 'termek_kod', 'mennyiseg' mezők berakása, ha át van adva...
putWhereIntoSession( array('termek_nev', 'termek_kod', 'mennyiseg'  ) );
// Használat előtt:
$_SESSION['where'] = imploe( ' AND ', $_SESSION['where' );
// A szükséges függvény a begyűjtésre:
function putWhereIntoSession( $fields ) {
	foreach( $fields as $field) {
		if( isset($_POST[$field]) ) {
			$_SESSION['where'][]  = $field.' LIKE \'%'.mysql_real_escape_string($_POST[$field]).'%\'';
		}
	}
}
?>
8

Jónak jó :)

chipi · 2007. Ápr. 19. (Cs), 21.53
Hát csak eggyet gépeltél el benne egy D kimaradt belőle a függvénynél.
De ezt nem értem, hogy ha kap értéket akkor is hibát ír ki de ezzel a sorral problémázik.
putWhereIntoSession( array('termek_nev', 'termek_kod', 'mennyiseg' ) );
9

kettőt...

TeeCee · 2007. Ápr. 20. (P), 10.10
... hibáztam, mert a $_SESSION['where után nem zártam be szögletessel...

A mysql_real_escape_string()-miatt élő mysql-kapcsolatra van szükséged.
Ha ilyen nincs, akkor mysql_escape_string()-et használj...
Az implode elé meg raktam még egy @-t, hogy ha üres tömb, akkor ne adjon warningot.

Ez nálam megy:

<?php
$_SESSION = array();
$_POST['termek_nev'] = 'izékebigyó';
// A 'termek_nev', 'termek_kod', 'mennyiseg' mezők berakása, ha át van adva...
putWhereIntoSession( array('termek_nev', 'termek_kod', 'mennyiseg'  ) );
// Használat előtt:
$_SESSION['where'] = @implode( ' AND ', $_SESSION['where'] );
echo '<pre>';
print_r( $_SESSION );
// A szükséges függvény a begyűjtésre:
function putWhereIntoSession( $fields ) {
    foreach( $fields as $field) {
        if( isset($_POST[$field]) ) {
            $_SESSION['where'][]  = $field.' LIKE \'%'.mysql_real_escape_string($_POST[$field]).'%\'';
        }
    }
}
?>
10

Fatal error

chipi · 2007. Ápr. 20. (P), 15.38
Hát én próbálgattam mindenhogy, de mindig ezt kaptam vissza rá:
Fatal error: Call to undefined function: putwhereintosession()
és erre utal a hiba
putWhereIntoSession( array('termek_nev', 'termek_kod', 'mennyiseg' ) );

Élő mysql kapcsolatom az van mert elötte meg meghívtam az oldalra.
11

esetleg...

TeeCee · 2007. Ápr. 20. (P), 16.03
... a definiált függvényt rakd előre.

A PHP manual szerint:
"PHP 3-ban a függvényeket definiálni kell, mielőtt hivatkozás történik rájuk (függvényhívás előtt). PHP 4-től nincs ez a megkötés, kivéve amikor egy függvény feltételesen van definiálva,..."
Vagyis elvileg tök mindegy, hogy a fájl elején, vagy végén van definiálva.

Egyszer énis belefutottam, hogy nem volt jó a fájl végén definiálni, de az nagyon rég volt, lehet, hogy még PHP3-as időszakban...
12

Minden ok, de mégsem.

chipi · 2007. Ápr. 20. (P), 19.34
Hát a programod jó, de ha az érték nem szerepel az adatbázisban szépent ezt kapom ismét:

Warning: Unknown(): Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0


Megpróbáltam azt is, hogy a mysql queribe beírtam a WHERE termek_nev='cukor' és mivel ez nem létezik a fenti üzit kapom, már nem tudom, hogy mit csináljak vele, de nekimegyek a falnak vele :)
13

google mondja

gex · 2007. Ápr. 20. (P), 19.57
http://hu2.php.net/manual/en/ref.session.php#45641

szerk: ha az eredeti kódodban a $_SESSION["where"]=$where; sor előtt megnézted volna a var_dump($where);-t, akkor láthattad volna hogy a $where változó értéke null.
mindez feltételezés.
14

NULL

chipi · 2007. Ápr. 20. (P), 20.42
Igen megnéztem most és nulla, de nem tudom, hogy mit csináljak a hibával a php manuálban meg egy részét nem értem :(
15

Eggyet nem értek

chipi · 2007. Ápr. 21. (Szo), 22.29
Az adatbázisban 2 db táblám van, ha az eggyikre rákeresek akkor és ha nem talált a megadott keresésre semmit akkor a hibaüzit nem írja ki, de ha a másikban keresek rá akkor meg a hiba egyböl jelentkezik.
if(($_GET["page"]=="eladas") or ($_POST["page"]=="eladas")){
@$lekeres=mysql_query( "SELECT * FROM termekek_eladas $where ORDER BY $rendezes");
@$eredmeny = mysql_num_rows($lekeres);

// ----- Ha eladunk valamit ------- \\
if(isset($_GET["megvesz"])){
$id=$_GET["id"];$kod=$_GET["kod"];
$megvesz=mysql_query("SELECT * FROM termekek WHERE id='$id' AND termek_kod='$kod'");
$elad_leker=mysql_fetch_assoc($megvesz);
		}
//==================================================================================================
	}else{
// ha nem eladást keresünk
@$lekeres=mysql_query( "SELECT * FROM termekek $where ORDER BY $rendezes") ;
@$eredmeny = mysql_num_rows($lekeres);
}
//  ==== Ismétlő ciklus =====  \\
if($eredmeny==0){
$messenger="Nincs találat!";
//$_SESSION['where']= "";

}else{
for ($i=1; $i < ($eredmeny+1); $i++) {
     $termek_tomb[$i]=@mysql_fetch_assoc($lekeres);
										} 
		}
Azaz ha valamit eladok az e boltomba akkor az eladásoknál keresek és ha találat nulla akkor nincs üzi.
16

ha jól értem...

TeeCee · 2007. Ápr. 23. (H), 13.59
... akkor ezen kód lefutása esetén van problémád:

<?php
$id=$_GET["id"];$kod=$_GET["kod"];
$megvesz=mysql_query("SELECT * FROM termekek WHERE id='$id' AND termek_kod='$kod'");
$elad_leker=mysql_fetch_assoc($megvesz);
?>
1.) Ugye nem mondod komolyan, hogy EZEK UTÁN, miután leírtuk, hogy közvetlenül nem raksz be semmi kapott változót, mégis berakod...
2.) Megbeszéltük, hogy valszeg attól gyanús neki, hogy a $valami és a $_GET['valami'] is szerepel benne (biztos van még erre való utalás máshol is)
3.) De most őszintén, mennyiből tartott volna ezt beleírni?

<?php
$megvesz=mysql_query("SELECT * FROM termekek WHERE id='".mysql_real_escape_string($_GET["id"])."' AND termek_kod='".mysql_real_escape_string($_GET["kod"])."'");
?>
17

számokat kezeljük számként

Hodicska Gergely · 2007. Ápr. 24. (K), 22.04
id='".mysql_real_escape_string($_GET["id"])."'

Ez nem túl szerencsés, mert egy számot (az id valszeg az) feleslegesen szöveggel hasonlítasz össze. Az 5 = 5 kiértékelése kb. kétszer gyorsabb, mint az 5 = '5'-é.


Üdv,
Felhő
18

jogos...

TeeCee · 2007. Ápr. 25. (Sze), 09.19
... Miért van az, hogy mindig találsz bennem hibát? :D :D
Ez persze nem panasz, hanem szégyen rám nézve... :(

Mondjuk én úgy szoktam csinálni, hogy 1-től veszek fel értéket az adatbázisban, aztán (int)$_GET['id']-ként használom, így ha nem szám, akkor 0 lesz, vagyis nem kap találatot.

És akkor ezen túlmenően: ha a $_GET['kod'] is csak szám lehet, akkor azt is úgy...