Как я могу получить нулевое поле из Twitter API, чтобы хорошо играть с моей базой данных? - PullRequest
0 голосов
/ 06 декабря 2009

Простите, если у меня может быть какая-то фундаментальная ошибка здесь. Я предполагаю, что есть кое-что простое, что я пропускаю. Я хочу хранить обновления Twitter в базе данных только с несколькими полями: индекс автоинкремента, опубликованное время, актуальное обновление статуса и идентификатор пользователя, на который идет обновление.

Я просто сохраняю это последнее поле, чтобы предоставить метод фильтрации ответов.

Но похоже, что мой код SQL выдает ошибку. На момент написания этой статьи SQL правильно вставил два последних обновления, которые оба являются ответами для другого пользователя и, следовательно, содержат данные в поле in_reply_to_user_id. Но при третьем обновлении, на которое никто не отвечает, я получаю следующую ошибку:

Номер ошибки: 1064

У вас ошибка в синтаксисе SQL; проверьте руководство, которое соответствует ваша версия сервера MySQL для правильный синтаксис для использования рядом с ')' в строке 1

INSERT IGNORE INTO обновления (время, статус, пост, ответ) ЦЕННОСТИ (1260070319, «Я думаю, Джонни Кэш знал о чем он говорил в этом \ "А Мальчик по имени Су \ "песня. Этот парень оба fast и mean. ',' 6389320556 ',)

API Twitter не устанавливает значения по умолчанию для этого параметра. Я пробовал тот же запрос с параметром «favourited», и он правильно помечал каждую строку как «false» в моей базе данных. Поэтому я предполагаю, что моя проблема заключается в вставке пустой строки.

Для чего это стоит, вот мой метод CodeIgniter:

function insert_tweet($tweet){
    foreach($tweet as $t) {
        $when = strtotime($t->created_at);
        $status = $t->text;
        $postid = $t->id;
        $reply = $t->in_reply_to_user_id;
$sql = 'INSERT IGNORE INTO updates (time, status, postid, reply) VALUES (?, ?, ?, ?)';
        $this->db->query($sql, array($when, $status, $postid, $reply));
    }
}

Любая помощь, которую вы могли бы оказать, была бы великолепна! Я надеюсь, что предоставил достаточно информации!

Дополнительная информация : Следует также отметить, что CodeIgniter выдает следующую ошибку:

Произошла ошибка PHP

Серьезность: 4096

Сообщение: объект класса stdClass невозможно преобразовать в строку

Имя файла: database / DB_driver.php

Номер строки: 598

В случае, если это доказывает, что какая-то особая CI виновата.

Ответы [ 6 ]

0 голосов
/ 09 декабря 2009

Эй, ребята, ответы здесь кажутся близкими, но без сигары. Я получил некоторую помощь от замечательных людей на форумах CodeIgniter, и вот что я придумал:

$reply = (is_null($t->in_reply_to_user_id) || is_object($t->in_reply_to_user_id) ? ‘NULL’ : $t->in_reply_to_user_id);

По сути, как сказал Зак, он возвращает пустое поле из API Twitter в виде пустого объекта вместо нуля. Поэтому мне нужно было проверить, является ли это нулем или объектом, а затем вернуть NULL. А если нет, верните строку user_id.

Спасибо большое за помощь!

0 голосов
/ 08 декабря 2009

Вы пришли с форумов CodeIgniter, верно? Я думаю, что проблема исходит из вашей библиотеки Twitter. Вы можете опубликовать этот код? По какой-то причине он возвращает статус NULL как объект, чего не должен делать.

0 голосов
/ 06 декабря 2009

Почему бы не изменить последний столбец и установить для него значение по умолчанию NULL?

Если вы хотите вставить какую-либо запись без этого поля, вы просто игнорируете ее в операторе INSERT.

И не вставляйте запятую между последним значением столбца и правой скобкой. :)

0 голосов
/ 06 декабря 2009

Я не говорю на codeigniter, но я могу рассказать вам, как решить вашу проблему.
У вас есть два варианта

  1. Проверьте, является ли строка пустой; если да, вместо пустого значения вставьте ключевое слово null.

  2. Проверьте, является ли значение пустым, если это так, не включайте этот столбец в клоун и значения оператора вставки.

Надеюсь, это поможет

0 голосов
/ 06 декабря 2009

Я не уверен насчет codeigniter (никогда не использовал его), но я знаю, что вам нужно, чтобы нулевое значение отображалось как NULL

function insert_tweet($tweet){
    foreach($tweet as $t) {
            $when = strtotime($t->created_at);
            $status = $t->text;
            $postid = $t->id;
            $reply = (is_null($t->in_reply_to_user_id) ? 'NULL' : $t->in_reply_to_user_id);
            $sql = 'INSERT IGNORE INTO updates (time, status, postid, reply) VALUES (?, ?, ?, ?)';
            $this->db->query($sql, array($when, $status, $postid, $reply));
    }

}

Я не уверен, что это даст желаемый SQL:

INSERT IGNORE INTO updates (time, status, postid, reply) VALUES (1260070319, 'I guess Johnny Cash knew what he was talking about in that \"A Boy Named Suh\" song. That guy is both fast and mean.', '6389320556', NULL)

edit Также убедитесь, что поле в базе данных может быть пустым.

Надеюсь, это поможет ..

0 голосов
/ 06 декабря 2009

Я не знаю php, но в псевдокоде в стиле asp.net я бы сделал это ...

$this->db->query($sql, array($when, $status, $postid, string.IsNullOrEmpty($reply) ? null : $reply));

Надеюсь, вы сможете адаптироваться, просто нужно разобраться с пустым параметром.

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