#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
?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 Чтобы ответить на вопрос в вашем первом комментарии; насколько я не фанат этого, посмотрите одноэлементный шаблон