• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czemu zmienne nie są dostępne w tej funkcji?

Object Storage Arubacloud
0 głosów
291 wizyt
pytanie zadane 22 stycznia 2019 w PHP przez matilogias Obywatel (1,550 p.)

Wyświetlany jest taki błąd

  • NOTICE: UNDEFINED VARIABLE: MYSQLI IN C:\XAMPP\HTDOCS\SITE\PHP\VARIABLES.PHP ON LINE 32

    WARNING: MYSQLI_QUERY() EXPECTS PARAMETER 1 TO BE MYSQLI, NULL GIVEN IN C:\XAMPP\HTDOCS\SITE\PHP\VARIABLES.PHP ON LINE 32

    WARNING: MYSQLI_ERROR() EXPECTS EXACTLY 1 PARAMETER, 0 GIVEN IN C:\XAMPP\HTDOCS\SITE\PHP\VARIABLES.PHP ON LINE 32

zmienna siteText też jest nie zdefiniowana 

$mysqli = new mysqli('localhost', 'root', '', 'DB');

$siteText["test"] = "eeeee";

function getTextFromDB($name) {
    if(isset($siteText[$name])) {
        if($siteText[$name] == "")
            echo "Tekst nie jest przydzielony do tej zmiennej";
        else
            echo $siteText[$name];
    }
    else {
        $query = "INSERT INTO sites (site, name) VALUES ('".$_SERVER['PHP_SELF']."', '$name');";
        mysqli_query($mysqli, $query) or die(mysqli_error());
    }
}

getTextFromDB("test") 

 

3 odpowiedzi

+1 głos
odpowiedź 22 stycznia 2019 przez niezalogowany
wybrane 22 stycznia 2019 przez matilogias
 
Najlepsza

zmienne zdefiniowane spoza funkcji nie mają zasięgu w funkcji wink​​​​ dlatego też mysqli_query nie może znaleźć połączenia $mysqli 

 mysqli_query($mysqli, $query) or die(mysqli_error());

​​​

https://www.w3schools.com/php/php_variables.asp

 

a pozatym lepiej ucz się PDO ponieważ mysqli jest nie dość że trudniejsze (wg mnie ponieważ jest więcej funkcji do zapamiętania) to jeszcze możesz działać z nim tylko z mysql

1
komentarz 22 stycznia 2019 przez niezalogowany
Racja, nie pomyślałam o scopie zmiennych. Co zatem poradzić pytającemu? Jak nie chce przerabiać całkowicie kodu to może:

1. Zrobić zmienną globalną z identyfikatora połączenia (zaraz mi zmyją głowę za takie rady :( )

lub

2. Przekazać do funkcji identyfikator połączenia jako parametr.
1
komentarz 22 stycznia 2019 przez niezalogowany
najlepiej poradzić pytającemu przeczytać artykuł który dołączyłem tam wszystko jest napisane
komentarz 22 stycznia 2019 przez matilogias Obywatel (1,550 p.)
Wielkie dzięki za rady. Spodziewałem się że to może być błąd związany z zasięgiem zmiennych ale nie wiedziałem co dokładnie i jak to naprawić
0 głosów
odpowiedź 22 stycznia 2019 przez niezalogowany
Twój kod kończy się na 18 linii, a błąd jest sygnalizowany w 32. Daj cały kod.
komentarz 22 stycznia 2019 przez matilogias Obywatel (1,550 p.)

reszta kodu to zmienne i funkcje zupełnie nie związane z tym kodem

ale tak wygląda całość jeśli miało by to pomóc 

<?php
global $siteText;
$siteText["test"] = "eeeee";
$query = "SELECT name, text FROM sites WHERE site = '".$_SERVER['PHP_SELF']."'";
    $result = mysqli_query($mysqli, $query);
    
    while ($r = mysqli_fetch_assoc($result)) {
        $siteText[$r["name"]] = $r["text"];
    }

function site_name(){echo "strona administracyjna";}
function menu_elements() {include "elements/menu_elements.php";}

// This should get you a DateTime object from the date and year.
function getDateFromDay($dayOfYear, $year) {
  $date = DateTime::createFromFormat('z Y', strval($dayOfYear) . ' ' . strval($year));
  return $date;
}

function getTextFromDB($name) {
    echo 1;
    if(isset($siteText[$name])) {
        echo 2;
        if($siteText[$name] == "" && true)//admin
            echo "Tekst nie jest przydzielony do tej zmiennej";
        else
            echo $siteText[$name];
    }
    else {
        echo 3;
        $query = "INSERT INTO sites (site, name) VALUES ('".$_SERVER['PHP_SELF']."', '$name');";
        mysqli_query($mysqli, $query) or die(mysqli_error());
    }
}
?>		

 

0 głosów
odpowiedź 22 stycznia 2019 przez niezalogowany
W funkcji mysqli_error musisz podać identyfikator połączenia, stąd warning. Co do poprzednich błędów wynika z nich, że nieznane jest połączenie pod identyfikatorem $mysqli. Szukaj w kodzie, czy nawiązałeś to połączenie.
komentarz 22 stycznia 2019 przez matilogias Obywatel (1,550 p.)
Połączenie jest nawiązane w innym pliku i działa np w linijce nr 5 ale nie mam pojęcia dlaczego nie działa w linijce 32 zresztą to samo jest z tablicą $siteText
komentarz 22 stycznia 2019 przez niezalogowany
A może wywołujesz feralną funkcję zanim się połączyłeś? Brak kodu, aby to stwierdzić. Zobacz jednak, gdzie wywołujesz funkcję. Komunikaty parsera wskazują właśnie na wywołanie funkcji przed nawiązaniem połączenia.
komentarz 22 stycznia 2019 przez matilogias Obywatel (1,550 p.)
Dokładniej o której funkcji mówisz?
komentarz 22 stycznia 2019 przez niezalogowany
getTextFromDB  - tam ci wywala błędy (linia 32)
komentarz 22 stycznia 2019 przez matilogias Obywatel (1,550 p.)
Wątpię ponieważ identycznie się sprawy mają z tablicą $siteText ponieważ funkcja if w 22 linijce zawsze zwraca false nawet gdy jest wcześniej zdefiniowana

Podobne pytania

0 głosów
1 odpowiedź 505 wizyt
pytanie zadane 27 stycznia 2018 w PHP przez milo321 Użytkownik (610 p.)
0 głosów
2 odpowiedzi 254 wizyt
pytanie zadane 27 stycznia 2018 w PHP przez milo321 Użytkownik (610 p.)
0 głosów
1 odpowiedź 923 wizyt
pytanie zadane 27 czerwca 2016 w Sieci komputerowe, internet przez DL TD Nałogowiec (36,710 p.)

92,550 zapytań

141,394 odpowiedzi

319,522 komentarzy

61,935 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...