Функция PHP Доступ к соединению с базой данных - PullRequest
2 голосов
/ 20 июля 2011

Как разрешить функции получать доступ к соединению с базой данных без использования GLOBAL?

config.php

 DEFINE ('DB_HOSTNAME', 'hostname');
 DEFINE ('DB_DATABASE', 'database');
 DEFINE ('DB_USERNAME', 'username');
 DEFINE ('DB_PASSWORD', 'password');

 $dbc = mysqli_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);

 if(!$dbc) die("Unable to connect to MySQL: " . mysqli_error($dbc));

functions.php

 function something()
 {
 $info = mysqli_query($dbc, "SELECT info FROM text") or die("Error: ".mysqli_error($dbc));
 }

Выше приведено следующее сообщение об ошибке: mysqli_query () ожидает, что параметр 1 будет mysqli, ноль задан в

Ответы [ 5 ]

5 голосов
/ 20 июля 2011

Использовать параметры функции

function something ($dbc) {
  // your db code here
}

аргументы функции

2 голосов
/ 20 июля 2011

Либо передайте дескриптор базы данных в вашу функцию, как сказали @KingCrunch и другие, либо вызовите функцию, которая возвращает дескриптор:

В config.php:

function get_dbc() {
    $dbc = mysqli_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
    if(!$dbc) die("Unable to connect to MySQL: " . mysqli_error($dbc));
    return $dbc;
}

В functions.php:

require_once('config.php');

function something()
{
    $dbc = get_dbc();
    $info = mysqli_query($dbc, "SELECT info FROM text") or die("Error: ".mysqli_error($dbc));
}

Возможно, вы захотите взглянуть на Расширение mysqli и постоянные соединения , чтобы узнать, как можно предотвратить восстановление соединения при каждом вызове get_dbc(). Есть альтернативные подходы к этому, такие как создание одноэлементного класса для соединения с базой данных.

1 голос
/ 20 июля 2011

Есть два способа, один из которых - передача аргументов, а другой - использование замыкания функций, как сказал @Ondrej.Но мне интересно, что в обоих случаях вам нужно изменить код, если это так, тогда я бы предложил вам использовать ключевое слово global.

. Вы можете использовать ключевое слово global, чтобы получить область действия переменной *.1005 *

Попробуйте это ..

function something()
{
   global $dbc;
   $info = mysqli_query($dbc, "SELECT info FROM text") or die("Error: ".mysqli_error($dbc));
}

(ИЛИ)

Попробуйте это ...

function something()
{
    $dbc = func_get_arg(0);
     $info = mysqli_query($dbc, "SELECT info FROM text") or die("Error: ".mysqli_error($dbc));
}

и сделай это ....

$query = something($dbc);
0 голосов
/ 18 декабря 2016

это так просто, просто передайте переменную $ conn в другую вызывающую функцию (вместо создания нового соединения), например

yourpage.php

$conn = new mysqli($servername, $username, $password, $dbname);
someFunction ($conn)//you can add other parameters if you like 

function someFunction ($conn) {
    $result = mysqli_query ($conn, "SELECT * FROM examples);
}

Примечание. Это не очень хорошая практикавсегда устанавливайте новое соединение для доступа к базе данных. поэтому всегда устанавливайте соединение один раз и используйте его везде (но если ваше требование отличается и требует многократных соединений, вы можете сделать множественные соединения)

0 голосов
/ 20 июля 2011

Есть еще способы. Вы можете использовать классический процедурный стиль:

function something($dbc)

или анонимная функция (если вы используете PHP5.3):

$fn = function() using ($dbc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...