Параметры подключения MySQL не будут работать при сохранении в другом файле (иногда)

#php #mysql

#php #mysql

Вопрос:

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

В моем проекте есть 3 соответствующих файла:

 dbconfig.php
register.php
testmysql.php
  

dbconfig.php имеет эту функцию:

         public function connString()
        {
            $connString['host'] = $this->host;
            $connString['username'] = $this->username;
            $connString['password'] = $this->password;
            $connString['database'] = $this->database;                      
            return $connString;
        }
  

Я делаю это в testmysql.php , и это работает отлично:

     require('dbconfig.php');
    $dbObject = new dbconfig();

    $conn = $dbObject->connString();
    mysql_connect($conn['host'],$conn['username'],$conn['password']) or die(mysql_error());
    mysql_select_db($conn['database']) or die(mysql_error());
  

Но когда я делаю то же самое в register.php , происходит сбой:

 <div class="div_texbox">
    <select id="field1" name="field1" class="textbox">                                              
        <option value="0">Select</option>
        <?php                                           
            require('dbconfig.php');
            $dbObject = new dbconfig();

            $conn = $dbObject->connString();
            mysql_connect($conn['host'],$conn['username'],$conn['password']) or die(mysql_error());
            mysql_select_db($conn['database']) or die(mysql_error());

            $result = mysql_query("SELECT * FROM table") or die ('error selecting');                                            

            while ($row = mysql_fetch_array( $result ))
            {
                echo "<option value="" . $row['ID'] . "">" . $row['value'] . "</option>";
            }                                                       
        ?>                                          
    </select>
</div>
  

Подробнее о том, когда я говорю «сбой»:
Field1 это поле выбора, которое должно быть заполнено, но этого не происходит, и никакие другие поля в форме не отображаются (предположительно из-за die ).
Я попытался установить PHP-отладчик, чтобы увидеть выдаваемое сообщение, но не смог заставить его работать.
Если я жестко закодирую параметры подключения, все это работает.
var_dump Из $conn показывает, что он содержит все правильные значения по всем правильным индексам (также очевидно из того факта, что testmysql.php работает).

Кроме того, из-за некоторого устранения неполадок казалось, что это сбой при mysql_connect

Я проанализировал свой HTML-код отображаемой страницы, чтобы увидеть выходные данные PHP-скрипта, и вот что он показывает:

 ( ! ) Fatal error: Cannot redeclare class dbconfig in C:wampwwwsitedbconfig.php on line 10
Call Stack
#TimeMemoryFunctionLocation
10.0005698544{main}(  )..register.php:0
21.2728763824require( 'C:wampwwwsitedbconfig.php' )..register.php:106
  

конструктор dbconfig

 public function __construct($config = NULL)
        {
            if ($config != NULL)
            {
                $this->host = $config['hostname'];
                $this->database = $config['database'];
                $this->username = $config['username'];
                $this->password = $config['password'];
            }
            else
            {
                $this->host = $this->defaultConfig['hostname'];
                $this->database =$this->defaultConfig['database'];
                $this->username = $this->defaultConfig['username'];
                $this->password = $this->defaultConfig['password'];

            }
        }
  

Комментарии:

1. хм … SELECT * FROM table предоставляет ли вам таблицу со столбцом ID и value ?

2. or die() должен умереть

3. Да, в table таблице есть записи, и table в таблице есть столбцы с разными именами. Я изменил это только при публикации в SO. Как я уже сказал, простое жесткое кодирование mysql_connect параметров позволяет ему работать как шарм.

4. @xbonez Включить сообщение об ошибках. Поместите это над своей require строкой; ini_set('display_errors', 'On'); error_reporting(E_ALL);

5. Добавил строку и снова запустил страницу. Я по-прежнему не вижу никаких ошибок, но поле выбора не заполняется. Хорошо, я смог получить ошибку и отредактировал свой вопрос, чтобы отразить это. Ошибка что-то очищает, поэтому я пытаюсь посмотреть, могу ли я исправить это сейчас

Ответ №1:

Похоже, что вы включаете dbconfig.php более одного раза, что вызывает неустранимую ошибку cannot redeclare class.

Измените любую ссылку на

 require('dbconfig.php')
  

Для

 require_once 'dbconfig.php';
  

Пока вы этим занимаетесь, прекратите использование or die() и переключитесь на PDO и параметризованные инструкции.

Комментарии:

1. изменено require на require_once , но проблема та же. Может ли проблема быть вызвана в $dbObject = new dbconfig(); . Как я могу сделать так, чтобы, если экземпляр dbconfig() уже был объявлен, возвращался тот же экземпляр?

2. Кроме того, спасибо за подсказку о die() и PDO . Я die сразу же прекращу использовать и также изучу PDO

3. Fatal error: Cannot redeclare class dbconfig in C:wampwwwtutordbconfig.php . Публикую мой конструктор dbconfig в вопросе

4. @xbonez В этом случае вы либо определяете dbconfig класс более чем в одном расположении, либо вы не изменили все свои require вызовы в require_once

5. @xbonez Чтобы ответить на вопрос в вашем первом комментарии; насколько я не фанат этого, посмотрите одноэлементный шаблон