2012-12-24 9 views
6

Mam problem z przekazywaniem mysql_ * do obiektu mysqli.

Moja index.php plik jest skonstruowany jak w tym dwa pliki:

include('connect.php'); 
include('function.php'); 

Plik connect.php zawiera:

<?php 
$mysqli = new mysqli("localhost", "root", "test", "test"); 

if (mysqli_connect_errno($mysqli)) { 
    printf("Connection failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 
?> 

W function.php plik istnieje funkcja o nazwie showPage, która nie przyjmuje argumentów, ale korzysta z $ mysqli połączenie, w liniach takich jak ...

$result = $mysqli -> query("SELECT * FROM $table ORDER BY ID DESC"); // Seleziono tutto il contenuto della tabella 

nie mogę zarządzać go do pracy bez przechodzenia do funkcji $ mysqli zmienna, ale nie było to konieczne, kiedy stosowane mysql_ * nieaktualnych funkcji!

Czy mogę zrozumieć, dlaczego i jaki jest najlepszy sposób rozwiązania tego problemu?

+0

@Wired po usunięciu hasła, a następnie probablu nadal używać go – iamart

+1

jak wcześniej było starej bazy danych (w lokalnej zbyt), jestem testowania na nim. Ale nadal nie chcę, aby moje dane były pisane dookoła sieci = P i tak mnie to niepokoi – wiredmark

Odpowiedz

7

Funkcje zdefiniowane przez użytkownika mają własny zakres zmiennych w PHP. Musisz przekazać $mysqli do funkcji jako parametr lub uruchomić funkcję global $mysqli.

Ten problem jest dokładnie podane jako przykład na stronie Variable scope:

Jednak w funkcji zdefiniowanych przez lokalny zakres funkcji wprowadzonych. Każda zmienna używana wewnątrz funkcji jest domyślnie ograniczona do lokalnego zakresu funkcji. Na przykład ten skrypt nie wygeneruje żadnego wyniku wyjściowego, ponieważ instrukcja echo odwołuje się do lokalnej wersji zmiennej $ a i nie została przypisana w tym zakresie do wartości . Możesz zauważyć, że jest to trochę inny z języka C, ponieważ zmienne globalne w C są automatycznie dostępne dla funkcji, chyba że zostały specjalnie przesłonięte przez lokalną definicję . Może to powodować pewne problemy, ponieważ ludzie mogą nieumyślnie zmienić zmienną globalną. W PHP zmienne globalne muszą być deklarowane jako globalne wewnątrz funkcji , jeśli mają być użyte w tej funkcji w .

<?php 
$a = 1; /* global scope */ 

function test() 
{ 
    echo $a; /* reference to local scope variable */ 
} 

test(); 
?> 
+0

Zmienne globalne to zło xD, ale twoja była najlepszą odpowiedzią. Byłem przyzwyczajony do C, dlatego nie mogłem tego zrozumieć. Wolę przekazywać zmienne jako parametr za każdym razem w tym momencie. Dzięki. – wiredmark

+1

W tym przypadku zmienna globalna jest w pełni poprawnym i zrozumiałym wzorem projektu. W końcu obiekt połączenia z bazą danych jest obiektem globalnym w aplikacji. Chciałbym jednak zawinąć twój obiekt mysqli w obiekt użytkownika utworzony przez użytkownika i używać tego obiektu na całym świecie, ponieważ zapewni to elastyczność w zakresie wprowadzania ulepszeń/aktualizacji bez konieczności wprowadzania zmian hurtowych w aplikacji. –

0

nie może zarządzać go do pracy bez przechodzenia do funkcji $ mysqli zmienna, ale nie było to konieczne, kiedy stosowane mysql_ * nieaktualnych funkcji!

To nie jest prawda. Nawet w starym mysql_* funkcji, którą rzeczywiście miał przekazać identyfikator połączenia jeśli potrzebne, aby określić do który połączenie z bazą danych zostałeś dotycząca np:

$result = mysql_query($sql, $link); 

także co ten przykład pokazuje, trzeba było przejść także $result. W przypadku, gdy nie pominąć parametr $link:

$result = mysql_query($sql); 

Rozszerzenie mysql wyglądał wewnętrznie do ostatnio używanego połączenia. Jeśli żaden nie zostałby znaleziony, utworzyłby nowy z parametrami ustawionymi w php.ini. To tylko dla twoich informacji, aby lepiej zrozumieć, dlaczego i jak to działało w przeszłości.

0

Można również użyć łączenia połączeń, warto sprawdzić this na zewnątrz.

$mysqli = new mysqli('p:localhost', 'username', 'password', 'db_name'); 
Powiązane problemy