2012-12-30 4 views
3

Операторы, подготовленные PDO, останавливают перенаправление, когда соединение с базой данных находится в отдельном файле (config.php). Запрос работает правильно (т. Е. Правильно вставляет и т. Д.), А перенаправление работает очень хорошо, когда соединение с базой данных находится в документе, а не в отдельном файле, но оно перестает работать, когда соединение db перемещается в другой файл. Это не вызывает сообщений об ошибках.Оператор, подготовленный PDO, останавливает перенаправление, если соединение db находится в файле конфигурации

Чтобы исключить другие проблемы, упомянутые в похожих вопросах (сообщения об ошибках и путь к URL). Я также удалил сообщения об ошибках (так что это определенно ничего не печатало в документе) и попытался заменить относительный путь полным URL-адресом. Когда отчет об ошибках включен, он завернут в блок try/catch, как показано.

ОБНОВЛЕНИЕ - ниже код работает, но если я заменю $conn = new PDO... с require_once('config.php'); он больше не переадресовывает (независимо от того, или нет сообщений об ошибках Создаются). Я также удалил лишние пробелы, которые могут вызвать проблемы, а также закрытие?>.

Я также попытался имея перенаправлять до и после того, как заявление на вылов (а также удаления/поймать блок TRY)

<?php 
session_start(); 

$conn = new PDO('mysql:host=localhost;dbname=click2fit', 'db_username', 'DB_Password'); 

try { 
     $stmt = $conn->prepare('INSERT INTO customer_info (user_id, fname, lname) 
     VALUES(:user_id, :fname, :lname)'); 

     $stmt->bindParam(':user_id', $user_id); 
     $stmt->bindParam(':fname', $_POST['fname'], PDO::PARAM_STR); 
     $stmt->bindParam(':lname', $_POST['lname'], PDO::PARAM_STR); 

     $stmt->execute(); 

     header("location: page2.html");   
     exit(); 
} catch(PDOException $e) { 
    echo 'Error: ' . $e->getMessage(); 
} 

config.php:

<?php 
    $conn = new PDO('mysql:host=localhost;dbname=click2fit', 'db_username', 'DB_Password'); 
?> 

конфигурации. php с сообщением об ошибке включен:

<?php 

    $salt = "XXXXXXXXXXXXXXXXXXX"; 

    try { 
    $conn = new PDO('mysql:host=localhost;dbname=click2fit', 'db_username', 'DB_Password'); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch(PDOException $e) { 
echo 'ERROR: ' . $e->getMessage(); 
} 
+2

Какое перенаправление? Пожалуйста, разместите соответствующий код, который сломан. Я предполагаю, что отдельный файл include содержит errant whitespace, который разбивает вызов 'header()'. Возможно, даже простая дополнительная строка после закрытия '?>' –

+0

Я использовал PHP + PDO с несколькими различными СУБД (MySQL и PostgreSQL), и у меня всегда есть соединение с базой данных в отдельном файле include. Я не знаю об этой проблеме. – jap1968

+2

Включить отчет об ошибках 'error_reporting (E_ALL); ini_set ('display_errors', 1); 'и искать материал, связанный с [этой проблемой] (http://stackoverflow.com/questions/8028957/headers-already-sent-by-php) –

ответ

1

я, наконец, понял, что эта проблема вызвана известной проблемой с кодированными страницами UTF-8, иногда создавая дополнительную строку кода в верхней части страниц/включенных файлов (link to w3.org's explanation of this issue), и поскольку они не видны, удаление видимых пробелов не исправляет ее , Я даже не знал, что это было настроено где угодно, так как все среды разработки, которые я использовал (Visual Web Developer и несколько других), автоматически сохраняют документы в UTF-8.

Лучшее решение, которое я нашел, - это сохранить файлы в текстовом редакторе как UTF-8 без спецификации. Способ сделать это в Notepad ++ или Visual Studio/Visual Web Developer (два текстовых редакторов, которые я использую), являются:

  • Notepad ++ - Нажмите на «Преобразовать в UTF-8 без BOM» вариант в соответствии с лицензией Encoding Tab, а затем повторно сохранить документы.
  • Visual Studio/Visual Web Developer Express 2010 - Используйте дополнительные параметры сохранения для сохранения с правильной кодировкой UTF-8 - Unicode (UTF-8 без подписи) - Codepage 65001. Чтобы получить доступ к расширенным параметрам сохранения в Visual Web Developer Express, выберите «Сохранить как», а затем нажмите маленькую стрелку вниз на кнопке «Сохранить» на «Сохранить с кодировкой».

Мне также пришлось изменить кодировку в документе HTML, чтобы избежать появления странных символов, когда я эхо от php до html-документа.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

Это похоже на работу с UTF-8 набор в HTML и Нет BOM в PHP, но если вы хотите, чтобы использовать Нет спецификации в HTML, а также, я нашел 3 варианта синтаксиса, которые работали в Firefox: charset = utf-8 без спецификации; charset = UTF-8 no-BOM; charset = кодировка UTF-8 без спецификации (я обновлю это, как только у меня будет возможность проверить код немного больше).

+1

Мне любопытно, почему это было проголосовано? (Учитывая, что мне потребовалось немало детективной работы, чтобы обнаружить, что причина проблемы, я написал пошаговое решение, как я исправил проблему) –

0

Существует высокая вероятность того, что ваш отправляющий вывод на лоб ser перед вашей функцией header(), что приведет к сбою переадресации.

Вы должны обернуть свой запрос в блок try/catch, чтобы убедиться, что вы правильно обрабатываете и регистрируете любые PDO exceptions, которые могут быть выброшены.

Что касается отладки проблемы, используйте ваши файлы журналов и/или die("here") и пройдите через код, это лучшее, что я могу предложить, без дополнительной информации. Возможно, вам придется просмотреть файл журнала apache/IIS, чтобы найти какие-либо исключения.

И наконец, избавиться от закрытия ?>, чтобы гарантировать, что пробелы не выводится в браузер (вы упомянули вы очистить это вверх уже, но это лучшая практика, которую вы должны следовать)

+0

Когда у меня есть сообщение об ошибке, оно завернуто в блок try/catch (Я не думал указывать, что :-)). Я принял ваш совет и удалил закрытие?>, Но, к сожалению, это тоже не помогло. Я попробую просмотреть файл журнала, чтобы узнать, могу ли я что-нибудь найти. –