Неопределенное исключение «PDOException» с сообщением «SQLSTATE [HY000]: общая ошибка: несоответствие типов данных 20» в /media/Data/Documenten/PHP/µBot/index.php:100 - PullRequest
2 голосов
/ 26 октября 2011

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

robin@robin-Latitude-D620:/media/Data/Documenten/PHP/µBot$ php index.php 
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/sqlite.so' - /usr/lib/php5/20090626/sqlite.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 20 datatype mismatch' in /media/Data/Documenten/PHP/µBot/index.php:100
Stack trace:
#0 /media/Data/Documenten/PHP/µBot/index.php(100): PDOStatement->execute()
#1 /media/Data/Documenten/PHP/µBot/index.php(73): addToLog('439', '*', 'irc.gmake.org', ':Please wait wh...')
#2 {main}
  thrown in /media/Data/Documenten/PHP/µBot/index.php on line 100

Блок кода, где должна лежать проблема (строка 100 - последняя строка этого блока):

function addToLog($type, $channel, $host, $message)
{
    global $database;
    $temp = explode('!', $host);
    $nick = $temp[0];
    unset($temp);
    $timestamp = time();
    $nickprefix = '';
    $query = $database->prepare("INSERT INTO log VALUES ('', :channel, :nick, :host, :message, :type, :time, '');");
    $query->bindParam(':channel', $channel);
    $query->bindParam(':nick', $nick);
    $query->bindParam(':host', $host);
    $query->bindParam(':message', $message);
    $query->bindParam(':type', $type);
    $query->bindParam(':time', $timestamp); 
    $query->execute();
}

Полный код: http://pastebin.com/CXCQjqb0

-

Версия SQLite: sqlite 2.8.17-6.1ubuntu1
Версия PHP: php5-common 5.3.6-13ubuntu3.2

Ответы [ 2 ]

6 голосов
/ 26 октября 2011

Я не знаю вашу схему, но я предполагаю, что id - это столбец с автоинкрементом, и это:

INSERT INTO log (id, channel, nick, host, message, type timestamp, nickprefix)
VALUES ('', :channel, :nick, :host, :message, :type, :time, '');

пытается вставить пустую строку в id.Вы, вероятно, хотите это:

INSERT INTO log (channel, nick, host, message, type timestamp, nickprefix)
VALUES (:channel, :nick, :host, :message, :type, :time, '');

И, пожалуйста, всегда указывайте список столбцов с вашими ВСТАВКАМИ и просто пропускайте любые значения, для которых база данных будет предоставлять значения (это включает как автоматически увеличивающиеся столбцы, так и столбцы с другимизначения по умолчанию).

0 голосов
/ 26 октября 2011

Я не знаю SQLLITE, но после быстрого прочтения документации и поиска атрибута ':' я обнаружил следующее:

Имя параметра хоста

const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int);

Интерфейс sqlite3_bind_parameter_name (P, N) возвращает имя N-го параметра SQL в подготовленном операторе P. Параметры SQL в форме «? NNN» или «: AAA», «@AAA» или «$ AAA» имеютимя, которое является строкой "? NNN" или ": AAA" или "@AAA" или "$ AAA" соответственно.Другими словами, начальные ":" или "$" или "@" или "?"включен как часть имени.Параметры вида "?"без следующего целого числа не имеют имени и называются «безымянные» или «анонимные параметры».

Первый параметр хоста имеет индекс 1, а не 0.

Если значение Nвне диапазона или, если N-й параметр не имеет имени, возвращается NULL.Возвращаемая строка всегда находится в кодировке UTF-8, даже если названный параметр изначально был указан как UTF-16 в sqlite3_prepare16 () или sqlite3_prepare16_v2 ().

Итак, следующая ошибка (глядя на сообщение в # 1) может относиться к «:» в тексте.Попробуйте удалить его из текста и посмотрите, что произойдет.

0 /media/Data/Documenten/PHP/µBot/index.php(100): PDOStatement-> execute ()

1/media/Data/Documenten/PHP/µBot/index.php(73): addToLog ('439', '*', 'irc.gmake.org', ': пожалуйста, подождите, пока ...')

2 {main}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...