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
  1. <?php  
  2. // keresés  
  3. if(isset($_POST["kereses"]))  
  4. {  
  5. extract($_POST);  
  6. $where="WHERE ";  
  7. if(isset($_POST["termek_nev"])){  
  8. // cégnév  
  9. $_POST["termek_nev"];  
  10.  $where  .= "termek_nev LIKE '%$termek_nev%'";  
  11.                                 }  
  12. // cikkszám  
  13. if(isset($_POST["termek_kod"])){  
  14. $_POST["termek_kod"];  
  15.  $where  .= " AND termek_kod LIKE '%$termek_kod%'";  
  16.                                 }  
  17.                                 // mennyiség  
  18. if(isset($_POST["mennyiseg"])){  
  19. $_POST["mennyiseg"];  
  20.  $where  .= " AND mennyiseg LIKE '%$mennyiseg%'";  
  21.                                 }  
  22. // eladás.php  
  23. if($_POST["page"]=="eladas"){  
  24.   
  25. if(isset($_POST["vevo"])){  
  26. $_POST["vevo"];  
  27.  $where  .= " AND megrendelo LIKE '%$vevo%'";  
  28.  }  
  29. if(isset($_POST["szm"])){  
  30. $_POST["szm"];  
  31.  $where  .= " AND v_szm LIKE '%$szm%'";  
  32.  }  
  33.                           
  34.   
  35. // elada.php zárótgaja  
  36. }  
  37. else{  
  38. // termék név  
  39. if(isset($_POST["megnevezes"])){  
  40. $_POST["megnevezes"];  
  41.  $where  .= " AND megnevezes LIKE '%$megnevezes%'";  
  42.                                 }  
  43. // datum  
  44. if(isset($_POST["datum"])){  
  45. $_POST["datum"];  
  46.  $where  .= " AND datum LIKE '%$datum%'";  
  47.                             }  
  48. // huf  
  49. if(isset($_POST["huf"])){  
  50. $_POST["huf"];  
  51.  $where  .= " AND huf LIKE '%$huf%'";  
  52.                         }  
  53. // számlaszám  
  54. if(isset($_POST["szm"])){  
  55. $_POST["szm"];  
  56.  $where  .= " AND szm LIKE '%$szm%'";  
  57.  }  
  58. // euró                       
  59. if(isset($_POST["euro"])){  
  60. $_POST["euro"];  
  61.  $where  .= " AND euro LIKE '%$euro%'";  
  62.                         }}  
  63.   
  64. $_SESSION["where"]=$where;  
  65.   
  66. // kersés zárótag  
  67. }  
  68. ?>  
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:
  1. <?php  
  2. $_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:
  1. <?php  
  2. if(isset($_POST["termek_kod"])){  
  3.  $where  .= " AND termek_kod LIKE '%$termek_kod%'";  
  4. }  
  5. ?>  
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):
  1. <?php  
  2. // A 'termek_nev', 'termek_kod', 'mennyiseg' mezők berakása, ha át van adva...  
  3. putWhereIntoSession( array('termek_nev''termek_kod''mennyiseg'  ) );  
  4. // Használat előtt:  
  5. $_SESSION['where'] = imploe( ' AND '$_SESSION['where' );  
  6. // A szükséges függvény a begyűjtésre:  
  7. function putWhereIntoSession( $fields ) {  
  8.     foreach$fields as $field) {  
  9.         if( isset($_POST[$field]) ) {  
  10.             $_SESSION['where'][]  = $field.' LIKE \'%'.mysql_real_escape_string($_POST[$field]).'%\'';  
  11.         }  
  12.     }  
  13. }  
  14. ?>  
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:
  1. <?php  
  2. $_SESSION = array();  
  3. $_POST['termek_nev'] = 'izékebigyó';  
  4. // A 'termek_nev', 'termek_kod', 'mennyiseg' mezők berakása, ha át van adva...  
  5. putWhereIntoSession( array('termek_nev''termek_kod''mennyiseg'  ) );  
  6. // Használat előtt:  
  7. $_SESSION['where'] = @implode( ' AND '$_SESSION['where'] );  
  8. echo '<pre>';  
  9. print_r( $_SESSION );  
  10. // A szükséges függvény a begyűjtésre:  
  11. function putWhereIntoSession( $fields ) {  
  12.     foreach$fields as $field) {  
  13.         if( isset($_POST[$field]) ) {  
  14.             $_SESSION['where'][]  = $field.' LIKE \'%'.mysql_real_escape_string($_POST[$field]).'%\'';  
  15.         }  
  16.     }  
  17. }  
  18. ?>  
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.
  1. if(($_GET["page"]=="eladas"or ($_POST["page"]=="eladas")){  
  2. @$lekeres=mysql_query( "SELECT * FROM termekek_eladas $where ORDER BY $rendezes");  
  3. @$eredmeny = mysql_num_rows($lekeres);  
  4.   
  5. // ----- Ha eladunk valamit ------- \\  
  6. if(isset($_GET["megvesz"])){  
  7. $id=$_GET["id"];$kod=$_GET["kod"];  
  8. $megvesz=mysql_query("SELECT * FROM termekek WHERE id='$id' AND termek_kod='$kod'");  
  9. $elad_leker=mysql_fetch_assoc($megvesz);  
  10.         }  
  11. //==================================================================================================  
  12.     }else{  
  13. // ha nem eladást keresünk  
  14. @$lekeres=mysql_query( "SELECT * FROM termekek $where ORDER BY $rendezes") ;  
  15. @$eredmeny = mysql_num_rows($lekeres);  
  16. }  
  17. //  ==== Ismétlő ciklus =====  \\  
  18. if($eredmeny==0){  
  19. $messenger="Nincs találat!";  
  20. //$_SESSION['where']= "";  
  21.   
  22. }else{  
  23. for ($i=1; $i < ($eredmeny+1); $i++) {  
  24.      $termek_tomb[$i]=@mysql_fetch_assoc($lekeres);  
  25.                                         }   
  26.         }  
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:
  1. <?php  
  2. $id=$_GET["id"];$kod=$_GET["kod"];  
  3. $megvesz=mysql_query("SELECT * FROM termekek WHERE id='$id' AND termek_kod='$kod'");  
  4. $elad_leker=mysql_fetch_assoc($megvesz);  
  5. ?>  
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?
  1. <?php  
  2. $megvesz=mysql_query("SELECT * FROM termekek WHERE id='".mysql_real_escape_string($_GET["id"])."' AND termek_kod='".mysql_real_escape_string($_GET["kod"])."'");  
  3. ?>  
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...