php sqlite_fetch_array поврежденные результаты - PullRequest
0 голосов
/ 10 июля 2010

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

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

поля (id, имя пользователя, имя, фамилия, пароль)

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

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

Проблема немного странная, когда я запрашиваю базу данных следующим образом:

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

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

запись (2, Адам, Адам, Таннер, 456)

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

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

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

chris adams <----chris </p>

Christopher Adamstopher <--- Стопер исходит от chri <strong>stopher


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

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

to preserve the code formatting, etc).</p>

<pre><code><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)."
");}} catch (Exception $ e) {die (" EXCEPTION OCCURED:'$ error' ");}?>

ТЕСТ PDO: SQLITE 2.x

запрос («SELECT * FROM users»);if ($ handle) {$ result = $ handle-> fetchAll (PDO :: FETCH_ASSOC);печать ( "
".print_r($result,true)."
");} else {var_dump ($ connection-> errorInfo ());print («запрос возвращен отрицательно»);}?>

PDO TEST: SQLITE 3.x

запрос («SELECT * FROM users»);if ($ handle) {$ result = $ handle-> fetchAll (PDO :: FETCH_ASSOC);печать ( "
".print_r($result,true)."
");} else {var_dump ($ connection-> errorInfo ());print («запрос возвращен отрицательно»);}?>

Результат выполнения этого кода:

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
        )
)

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

1 Ответ

2 голосов
/ 11 июля 2010
<?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?

...