Странная проблема с mysql_connect и mysql_selectdb, не принимающими некоторые переменные в качестве аргументов - PullRequest
1 голос
/ 05 февраля 2011

Я работал над некоторым кодом в курсе PHP, который мне помог, в среде LAMP, и работал без проблем. После курса я взял свой код домой и запустил его на WAMPServer, и по какой-то причине mysql_connect не принимает некоторые переменные в качестве аргументов. Я знаю это, потому что я попытался передать параметры mysql_connect вручную, и соединение работает. Кроме того, я повторил все четыре переменные, и они распечатали ОК.

Я новичок в PHP, но для меня это не имеет никакого смысла.

Код:

functions.php

 <?php

require ("config.php");
     function conectardb () { 
     mysql_connect ($server, $login, $pass);
     mysql_select_db ($db);
 }

?>


config.php

<?php
 $login = "root" ;
 $pass = "" ;
 $server = "localhost";
 $db = "testing";
?>

Я попытался заменить простые аргументы их переменными одну за другой, и обнаружил, что код работает до этого момента:

 function conectardb () { 
     mysql_connect ($server, "root", $pass);
     mysql_select_db ("testing");
 }

Если я использую $ login или $ db, соединение не будет работать. Есть идеи? Это сводит меня с ума.

Ответы [ 4 ]

2 голосов
/ 05 февраля 2011

Ваша проблема в области видимости переменных.

В отличие от большинства языков, php не знает автоматически о переменных, определенных вне функции.Чтобы получить к ним доступ, вам нужно указать их как global $server, $pass, $db; в функции или использовать переменные $_GLOBALS[].

См.:

  • Область переменных PHP (Посмотрите, как PHP управляет областью действия)
  • $_GLOBALS (Глобальные переменные, которые обеспечивают видимость внутри функций)
  • define() (Для глобальных констант, которые будут иметь видимость внутри функций)
2 голосов
/ 05 февраля 2011
require ("config.php");
function conectardb () 
{ 
    global $server, $login, $pass, $db;
    mysql_connect ($server, $login, $pass);
    mysql_select_db ($db);
}

Это должно помочь, поскольку переменные определены в другой области видимости.Однако я рекомендую передавать требуемые значения в качестве параметров.

function conectardb ($server, $login, $pass, $db) 
{ 
    mysql_connect ($server, $login, $pass);
    mysql_select_db ($db);
}
2 голосов
/ 05 февраля 2011

Это неправильное понимание области видимости в PHP.

Функции существуют в своей области видимости. Вы определили $login, $pass и т. Д. В области действия, отличной от функции. Функция не может получить к ним доступ, она их не видит.

Вы можете сделать пару вещей по этому поводу:

  1. Определить параметры подключения к базе данных как константы вместо переменных
  2. Определить переменные внутри функции (требование, чтобы файл конфигурации внутри функции имел такой же эффект)
  3. Используйте ключевое слово global, чтобы вытащить их из глобальной области видимости в область действия функции

т.е.

$bar = 'hello world';
function foo() {
    global $bar;
    echo $bar;
}
0 голосов
/ 05 февраля 2011

@ Дэвид Куриджа Я рекомендую не использовать компоненты mysql_ и использовать расширения mysqli или PDO, которые по умолчанию включены.

...