Я начал пытаться использовать 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
)
)
Если вы знаете, почему это происходит, спасибо за давая мне знать!
Извините, что некоторые из форматирования текста выше, кажется, что сайт немного изменил несколько мелочей, я надеюсь, что это не слишком раздражает –
, если форматирование вашего вопроса не так, как вы ожидаете, просто отредактируйте его! –
Я попытался исправить это, но я откинулся назад. Предварительный просмотр неисправен, и, хотя он выглядит неплохо, окончательным результатом были вложенные поля. – Artefacto