2009-07-22 3 views
1

PHP-приложение, которое отлично работает на сервере ламп не может требуется или включают файлы на всех после перехода на Windows Server 2003 машины. Например, если файл:PHP приложение не работает после перехода на машине Windows,

include("connectme.php"); 
    echo "==== $SERVER_NAME, $USER, $PASSWORD"; 
    $sql="SELECT id, model 
FROM `products` 
WHERE acc_code IS NULL 
OR acc_code =0"; 
    $prodset=mysql_query($sql); 


    while($prod=mysql_fetch_array($prodset,MYSQL_ASSOC)) 
    { 
     echo $prod[id].",".$prod[model]."<br>"; 
    } 

Файл подведет с ошибкой подключения MySQL, хотя параметры соединения указаны в прилагаемом connectme.php файл. Если я прокомментирую, что включает в себя строку и жестко программирует параметры подключения, он работает.

Любые идеи?

Благодаря

Update: в connectme.php параметров соединения определены и приведены значения. Но по какой-то причине переменные не видны в области включенных файлов. Когда я добавляю строку к echo, переменные $ SERVER_NAME, $ USER, $ PASSWORD были пустыми.

+0

Я не упомянул, что приложение размещено в виртуальном приложении, которое указывает на папку, которая находится за пределами папки IIS по умолчанию ** c: \ inetpub **, может потребоваться специальная настройка, позволяющая IUSR_ * получить доступ к файлам? – 2009-07-22 17:11:01

+0

Включение отчета об ошибках даст вам лучшее представление о том, в чем проблема. Попробуйте поставить 'error_reporting (E_ALL);' вверху вашего кода. – zombat

+0

Ниже приведено сообщение об ошибке для приведенного выше сценария: PHP Предупреждение: mysql_query() [function.mysql-query]: доступ запрещен для пользователя 'ODBC' @ 'localhost' (с использованием пароля: нет) в [путь к файлу] on line 20 PHP Предупреждение: mysql_query() [function.mysql-query]: ссылка на сервер не может быть установлена ​​в [path-to-file] в строке 20 PHP Предупреждение: mysql_fetch_array(): предоставленный аргумент не является действительный ресурс результата MySQL в [путь к файлу] в строке 23 – 2009-07-22 17:26:29

ответ

0

Я не знаю, какова ваша структура каталогов, но вы пробовали относительные пути в качестве теста?

Если он находится в том же каталоге:

include(".\\connectme.php"); 

???

+0

Оба файла находятся в одной папке на сервере Windows. – 2009-07-22 17:09:10

0

Вот что нужно обратить внимание: слэши в окнах идут в другом направлении, а также есть проблемы с символами новой строки. Попробуйте другие тесты на здравомыслие, например, включите файлы, которые выполняют эхо-сигналы, чтобы определить структуру каталогов и т. Д.

+0

Windows сама распознает/как символ разделителя путей и имеет, по крайней мере, Windows NT 4.0 в середине 90-х. – Powerlord

0

Проверьте разрешения на включенный файл. Вам нужно будет разрешить доступ к учетной записи IUSR для чтения и выполнения. После того, как вы это сделали, вы сможете получить доступ к файлу.

0

Это почти наверняка проблема include_path. Вы можете установить его несколькими путями.

Вы можете создать страницу с

<?php phpinfo(); ?> 

в нем, чтобы просмотреть текущий включать путь. Вы можете изменить его с помощью ini_set на своей странице, в конфигурационном файле php.ini или в файле .htaccess, если вы используете Apache.

Вы можете увидеть здесь:

http://us2.php.net/configuration.changes

0

Я бы заменить включают по требуют, так как это не обязательным для вашего сценария, и это не просто ошибка конфигурации, если файл не существует.

require "connectme.php"; 

Этот файл connectme.php содержит mysql_connect и mysql_select_db()? Затем добавьте по крайней мере некоторую базовую обработку ошибок в код подключения и получите доступ к ресурсу ссылки mysql.Абсолютный минимальный вариант

<?php 
$mysql = mysql_connect('...', '...', '...') or die(mysql_error()); 
mysql_select_db('...', $mysql) or die(mysql_error()); 

И затем используйте этот ресурс ссылки, а также добавьте обработку ошибок в mysql_query. Опять же, минимальная версия

$prodset=mysql_query($sql, $mysql) or die(mysql_error()); 
0

Может быть, некоторые конфигурации перезаписи по умолчанию включает в себя путь для PHP, чтобы гарантировать, что текущий реж находится в вашем include_path, вы можете попробовать это:

set_include_path(get_include_path() . PATH_SEPARATOR . "."); 
+0

оба файла находятся в одной папке. – 2009-07-22 17:39:02

+0

Да, но если в php.ini include_path не имеет "." (точка) он не будет включать файлы из текущего каталога без указания всего пути. – Nathan

+0

Include path имеет **. **:.; C: \ php5 \ pear – 2009-07-22 17:48:43

0

Вы передаете относительный путь включать(). Это относится к текущему рабочему каталогу. Возможно, cwd не то, что вы ожидаете. Некоторые дополнительные результаты отладки могут прояснить это.

<?php 
echo '<div>Debug: __FILE__=', __FILE__, '</div>'; 
echo '<div>Debug: cwd=', getcwd(), '</div>'; 
echo '<div>Debug: glob(*.php)=', join(', ', glob('*.php')), '</div>'; 
require "connectme.php"; 
0

Что произойдет, если вы скопируете содержимое файла connectme.php в основной файл?

просто угадывание: может быть какая-то проблема из-за различной конечной линии между linux и windows?

+0

Работает без проблем. Если ваше предположение верно, как я могу это решить? – 2009-07-22 20:19:23

+0

Я не уверен, что речь идет о концевой линии. Я держал пари на какой-то проблеме на пути, но вы можете попытаться ее исключить. В консоли bash попробуйте следующее: cat file.ori.php | sed 's/$' "/' echo \\\ r'/"> file.win.php здесь полный и удивительный справочник по sed damko

1

Оказалось, что некоторые файлы (включая connectme.php) используют короткие теги <? ? >, а поскольку сервер представляет собой новый сервер со свежей установкой PHP (в которой короткие теги не включены по умолчанию), он включает весь источник connectme.php без интерпретации. Довольно неуловимо!

Спасибо всем за вашу помощь!

Смежные вопросы