• 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?

VPS Starter Arubacloud
0 głosów
290 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ź 503 wizyt
pytanie zadane 27 stycznia 2018 w PHP przez milo321 Użytkownik (610 p.)
0 głosów
2 odpowiedzi 252 wizyt
pytanie zadane 27 stycznia 2018 w PHP przez milo321 Użytkownik (610 p.)
0 głosów
1 odpowiedź 895 wizyt
pytanie zadane 27 czerwca 2016 w Sieci komputerowe, internet przez DL TD Nałogowiec (36,710 p.)

92,452 zapytań

141,262 odpowiedzi

319,074 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...