Fatal eror query in functions - utilizarea unei variabile definite în afara funcției

function setari_pagini($pagina) {
  $setari_pag = $pdo->query('SELECT * FROM cotos_pagini WHERE tip_pagina = "'.$pagina.'"');
  while ($row = $setari_pag->fetch())
  {
    echo '
      <title>'.$row['titlu_pagina'].'</title>
      <meta name="keywords" content="'.$row['keywords_pagina'].'" />
      <meta name="description" content="'.$row['descriere_pagina'].'" />
    ';
  }
}

Notice: Undefined variable: pdo in C:\xampp\htdocs\core.php on line 16

Fatal error: Uncaught Error: Call to a member function query() on null in C:\xampp\htdocs\core.php:16 Stack trace: #0 C:\xampp\htdocs\despre-noi.php(9): setari_pagini(‘despre_noi’) #1 {main} thrown in C:\xampp\htdocs\core.php on line 16

$pdo nu e definit in contextul functiei. Probabil il definesti undeva in afara. Il poti pasa ca parametru la functie.

1 Like
function setari_pagini($pagina) {
  global $pdo;
  $setari_pag = $pdo->query('SELECT * FROM cotos_pagini WHERE tip_pagina = "'.$pagina.'"');
  while ($row = $setari_pag->fetch())
  {
    echo '
      <title>'.$row['titlu_pagina'].'</title>
      <meta name="keywords" content="'.$row['keywords_pagina'].'" />
      <meta name="description" content="'.$row['descriere_pagina'].'" />
    ';
  }
}

Aceasta este rezolvarea

1 Like

E bine ca iti functioneaza, e un pas bun.
Din pacate e un extremely bad practice folosirea globalelor. Un mod de a rezolva asta e ce te-a sfatuit @neamtua cu passrea ca variabila.

3 Likes

Alternativ, ai putea folosi use:

function setari_pagini($pagina) use ($pdo) {
....

Dar ori nu știu eu să caut, ori în manualul PHP acest… cuvânt cheie (? nici nu sunt foarte sigur ce e) este menționat doar în contextul namespace-urilor și în exemplele de la closures.

1 Like

Pasarea variabilelor , asta ce presupune mai exact ?

Introduci obiectul PDO ca parametru pentru functia ta si de asemenea, poti sa te folosesti de type hinting, iti voi da un exemplu:

function setari_pagina(PDO $pdo) {
    // corpul functiei, poti accesa $pdo aici
}

Type hinting presupune specificarea tipului unui parametru, in exemplul de mai sus am spus ca parametrul $pdo este de tipul PDO, cu alte cuvinte, trebuie sa fie o instanta a clasei PDO, astfel, te asiguri ca nu vei introduce altceva ca valoare pentru parametrul $pdo.

PHP - Totul despre functii

Variabilele globale creaza o vulnerabilitate in codul tau, fereste-te de asa ceva.

Iti voi da un exempu

<?php

$counter = 0;

function countBirds() {
    global $counter;
	
	return ++$counter . ' Birds <br>';
}

function countDogs() {
    global $counter;
	
	return ++$counter . ' Dogs <br>';
}

echo countBirds(); // se afiseaza 1 Birds
echo countDogs(); // se afiseaza 2 Dogs

In ambele functii eu folosesc $counter din contextul global, cu alte cuvinte, folosesc variabila $counter ce a fost declarata in exteriorul functiilor.Observi care este problema, variabila $counter si-a pastrat starea, aceasta fiind modificata atunci cand am apelat functia countBirds().Trebuia sa avem, de asemenea, “1 Dogs”, dar avem “2 Dogs”, acest lucru se intampla deoarece atunci cand am apelat functia countBirds(), am accesat variabila globala $counter si i-am adunat valoarea 1, la valoarea initiala.

Mai jos, introducand variabila $counter ca parametru pentru aceste functii, am scapat de folosirea ei ca variabila globala.


<?php

$counter = 0;

function countBirds($counter) {
	return ++$counter . ' Birds <br>';
}

function countDogs($counter) {
	return ++$counter . ' Dogs <br>';
}

echo countBirds($counter); // se afiseaza "1 Birds"
echo countDogs($counter); // se afiseaza "1 Dogs"

Nu stiu daca m-am facut inteles.

Variabilele globale sunt declarate in exteriorul corpului functiilor, in timp ce variabilele locale sunt declarate in interiorul corpului functiilor.Nu poti folosi o variabila globala in interiorul unei functii si nici viceversa.

Un articol scris de mine aici despre contextul in care variabilele sunt declarate si folosite.

3 Likes

AM incercat ->

function setari_pagina(PDO $pdo) use ($pagina) { si invers function setari_pagina ($pagina)  use (PDO $pdo) {
    // corpul functiei, poti accesa $pdo aici
}

Parse error: syntax error, unexpected 'use' (T_USE), expecting '{' in C:\xampp\htdocs\core.php on line 13

Nu poti sa folosesti use pentru functiile “normale”, poti sa introduci variabila $pagina ca parametru.

function setari_pagina(PDO $pdo, $pagina) {
    //..
}
1 Like

Fatal error: Uncaught Error: Call to undefined function setari_pagini() in C:\xampp\htdocs\index.php:8 Stack trace: #0 {main} thrown in C:\xampp\htdocs\index.php on line 8

pe index o afisez cu

setari_pagini('index');

Eroarea asta iti spune ca ai apelat functia setari_pagini() dar ea nu exista.Intrebare, unde ai declarat functia, in alt fisier? Daca este declarata in alt fisier, trebuie sa incluzi acel fisier in fisierul tau, index.php

Functia mi-a mers perfect cu global, spunandu-mi ca poate fi calculata ca vulnerabilitate am schimbat in ceea ce m-ai sfatuit…

core.php este inclus in config.php
iar config.php in index.php

am mutat functia pe index

si imi da

Fatal error: Cannot redeclare setari_pagina() (previously declared in C:\xampp\htdocs\index.php:8) in C:\xampp\htdocs\core.php on line 26
drept dovada ca o gaseste

am scos-o din core.php si am pus-o direct pe index

imi da

Fatal error: Uncaught Error: Call to undefined function setari_pagini() in C:\xampp\htdocs\index.php:22 Stack trace: #0 {main} thrown in C:\xampp\htdocs\index.php on line 22

Arunca o privire la numele functiei unde ai declarat-o.

1 Like

Chiar si asa tot eroare :frowning:

Fatal error: Uncaught TypeError: Argument 1 passed to setari_pagini() must be an instance of PDO, string given, called in C:\xampp\htdocs\index.php on line 8 and defined in C:\xampp\htdocs\core.php:13 Stack trace: #0 C:\xampp\htdocs\index.php(8): setari_pagini('index') #1 {main} thrown in C:\xampp\htdocs\core.php on line 13

Eu iti recomand sa fii mai atent cu ceea ce faci acolo, ai uitat sa introduci o valoare pentru primul parametru al functiei, valoare ce trebuie sa fie o instanta a clasei PDO, setari_pagini($pdo, ‘index’);

Imi cer mii de scuze, nu am stiut ca trbuie pus pdo in setari_pagini(‘index’);

Nici o problema, nu trebuie sa-ti ceri scuze, toti am avut un inceput! :smiley:

Exista posibilitatea asta :

$setare='cod_statistici'
function cotos_setari(PDO $pdo, $setarea) {

$cotos_setari = $pdo->query('SELECT * FROM cotos_setari WHERE id = "1"');
		  while ($row = $cotos_setari->fetch())
		{

echo $row['$setarea'];
		
		}

}

Ca ceea ce setez in $setarea sa se adauga in row si sa-mi afiseze o chestie din tabelul interogat ?
Imi recomanzi asta ?
Sau mai bine fac

$cotos_setari = $pdo->query('SELECT * FROM cotos_setari WHERE id = "1"');
		  while ($row = $cotos_setari->fetch())
		{
	$nume_site=$row['Nume_Site'];
	$logo_site=$row['Logo_Site'];
	$porneste_job=$row['Porneste_Job'];
	$cod_statistici=$row['Cod_Statistici'];
	$email_contact=$row['Email_Contact'];
	$telefon_contact=$row['Telefon_Contact'];
	$date_firma=$row['Date_Firma'];
	$embed_map=$row['Embed_Map'];
	$facebook_url=$row['Facebook_Url'];
		
		}

si de exemplu in footer voi adaugat pentru codul de statistici

<?php echo $cod_statistici; ?>

Poti sa faci ceva de genul:


function cotos_setari(PDO $pdo) { 
    $cotos_setari = $pdo->query("SELECT * FROM cotos_setari WHERE id = '1'");

    return $cotos_setari->fetch(PDO::FETCH_ASSOC);
}

$cotos_setari = cotos_setari($pdo);

if ($cotos_setari) {
    echo $cotos_setari['Nume_Site'];
}

Multumesc :smiley:

Vreau sa fac inasa fel sa consume cat mai putine resurse sa nu faca nici interogari aiurea pentru x daca eu nu am nevoie sa-l afisez in acea pagina…