2010-07-10 2 views
0

Я начал пытаться использовать sqlite для размещения небольших сайтов и на моем личном сервере, я столкнулся с гличем, который портит всю идею.php sqlite_fetch_array поврежденные результаты

У меня очень простой пример теста, в таблице из двух строк в базе данных sqlite 2.x, я размещен с 5.2.12, я также пытался с базой данных PDO sqlite3, проблема в этом. «Пользователи» таблицы, имеет какую-то информацию, таблица как этот

полей (идентификатор, имя пользователя, имя, фамилия, пароль)

Есть две записи в таблице, они

запись (1, Крис, Кристофер Томас, 123) запись (2, адам, Адам, Tanner, 456)

проблема немного странно, когда я запрос к базе данных, как это:

запрос (» выберите * от пользователей, где id = 2 ")

я получить правильные результаты, как это показано ниже:

вход (2, адам, Адам, Tanner, 456)

Когда я прошу всех строк, как этот запрос ("выберите * от пользователей «) Я получаю это:

вход (1, Крис, Кристофер, Tanner, 456) запись (2, Адамса, Adamstopher, Tanner, 456)

вы видите, что, кажется, случилось? Информация во второй записи меньше символов, чем первая запись, поэтому, похоже, она просто переписывает данные со второй записью, вызывая некоторое повреждение.

Крисом Адамс < ---- эля происходит от Криса

Кристофер Adamstopher < --- stopher происходит от ЧРИ stopher


код очень прост, это это то, что я запускаю, я пытаюсь выполнить прямые sqlite_ * вызовы sqlite2, а затем PDO для sqlite2 и sqlite3 версий одной и той же базы данных, чтобы убедиться, что есть какие-либо сомнения.

(BTW: Я добавил некоторые простые изменения разметки html и все, чтобы все выглядело лучше на веб-сайте stackoverflow, эти изменения не в исходном коде, но это всего лишь вещи, такие как h1-> p или обертывание вещей с <pre>, чтобы сохранить форматирование кода и т. д.).

<p>TEST 1 with direct sqlite_* calls</p> 
<?php 
try{ 
    $connection = sqlite_open("../playground.sqlite",0666,$error); 
    $handle = sqlite_query("select * from users",$connection); 

    $numResults = sqlite_num_rows($handle); 

    for($a=0;$a<$numResults;$a++){ 
     print("<pre>".print_r(sqlite_fetch_array($handle,SQLITE_ASSOC),true)."</pre>");  
    } 

}catch(Exception $e){ 
    die("EXCEPTION OCCURED: '$error'"); 
} 
?> 
<p>PDO TEST: SQLITE 2.x</p> 
<?php  
    $connection = new PDO('sqlite2:../playground.sqlite'); 
    $handle = $connection->query("SELECT * FROM users"); 

    if($handle){ 
     $result = $handle->fetchAll(PDO::FETCH_ASSOC); 
     print("<pre>".print_r($result,true)."</pre>"); 
    }else{ 
     var_dump($connection->errorInfo()); 
     print("query returned negatively"); 
    } 
?> 
<p>PDO TEST: SQLITE 3.x</p> 
<?php  
    $connection = new PDO('sqlite:../playground.sqlite3'); 
    $handle = $connection->query("SELECT * FROM users"); 

    if($handle){ 
     $result = $handle->fetchAll(PDO::FETCH_ASSOC); 
     print("<pre>".print_r($result,true)."</pre>"); 
    }else{ 
     var_dump($connection->errorInfo()); 
     print("query returned negatively"); 
    } 
?> 

Выход запуска этого кода:

TEST 1 with direct sqlite_* calls 
Array 
(
    [id] => 1 
    [username] => chris 
    [forename] => Christopher 
    [surname] => Thomas 
    [password] => 123 
) 

Array 
(
    [id] => 2 
    [username] => adams 
    [forename] => Adamstopher 
    [surname] => Tanner 
    [password] => 456 
) 

PDO TEST: SQLITE 2.x 
Array 
(
    [0] => Array 
     (
      [id] => 1 
      [username] => chris 
      [forename] => Christopher 
      [surname] => Thomas 
      [password] => 123 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [username] => adams 
      [forename] => Adamstopher 
      [surname] => Tanner 
      [password] => 456 
     ) 

) 

PDO TEST: SQLITE 3.x 
Array 
(
    [0] => Array 
     (
      [id] => 1 
      [username] => chris 
      [forename] => Christopher 
      [surname] => Thomas 
      [password] => 123 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [username] => adams 
      [forename] => Adamstopher 
      [surname] => Tanner 
      [password] => 456 
     ) 
) 

Если вы знаете, почему это происходит, спасибо за давая мне знать!

+0

Извините, что некоторые из форматирования текста выше, кажется, что сайт немного изменил несколько мелочей, я надеюсь, что это не слишком раздражает –

+0

, если форматирование вашего вопроса не так, как вы ожидаете, просто отредактируйте его! –

+0

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

ответ

2
<?php 
echo PHP_VERSION, ' ', PHP_OS, ' ', PHP_SAPI, "\n"; 

$pdo = new PDO('sqlite:sotest.sqlite'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$pdo->exec('DROP TABLE IF EXISTS users'); 
$pdo->exec('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY ASC, username,forename,surname,password)'); 
$pdo->exec("INSERT INTO users (id,username,forename,surname,password) VALUES (1,'chris','Christopher','Thomas',123)"); 
$pdo->exec("INSERT INTO users (id,username,forename,surname,password) VALUES (2,'adam','Adam','Tanner',456)"); 

$rows = $pdo->query("SELECT Length(forename) as cForename, Length(surname) as cSurname, * FROM users")->fetchAll(PDO::FETCH_ASSOC); 
print_r($rows); 

на моей машине гравюр

5.3.2 WINNT cli 
Array 
(
    [0] => Array 
     (
      [cForename] => 11 
      [cSurname] => 6 
      [id] => 1 
      [username] => chris 
      [forename] => Christopher 
      [surname] => Thomas 
      [password] => 123 
     ) 

    [1] => Array 
     (
      [cForename] => 4 
      [cSurname] => 6 
      [id] => 2 
      [username] => adam 
      [forename] => Adam 
      [surname] => Tanner 
      [password] => 456 
     ) 

) 

Вы можете воспроизвести ошибочное поведение с помощью этого кода на вашем сервере 5.2.x?

+0

ok, thats просто странный, т генерировать ошибку, вы можете увидеть здесь результаты http://burning-candle.com/widget-playground/profile-image/test_database2.php и http://burning-candle.com/widget -playground/profile-image/test_database2.phps (я сделал небольшой мод для вывода внутри <pre>, поэтому он правильно форматирует). ok, это тестовый пример, позволяет найти минимальный код, необходимый для воспроизведения моей ошибки, интересно, получает ли он длины, которые это делают? или, возможно, создание таблиц с помощью инструмента, Я с (SQLiteManager 3.1.1 от sqlabs.net) –

+0

проверить эти http://burning-candle.com/widget-playground/profile-image/test_database3.php и http://burning-candle.com/widget-playground/profile-image/test_database4.php –

+0

ой, мне не нравится, как это ставит ссылки, grr !! –

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