2011-03-04 7 views
0

Я отходил некоторые данные из щебета API запросов и анализ через PHP как так:Помогите мне отладить мой SQL INSERT, пожалуйста?

$i =0; 
    foreach ($tweetArray->results as $tweet) { 
     $timeStamp = strtotime($tweet->created_at); 
     $tweetDateTime = date('m-d-Y H:m:s', $timeStamp); 
     if($i > 0){ 
      $SQL .= ','; 
     } 
     $SQL .= "(". $tweet->id .",'" . $tweet->from_user ."','". addslashes($tweet->profile_image_url) . "','". addslashes($tweet->text). "','" . $tweetDateTime ."')"; 
     $i++; 
    } 
    $SQL .= " ON DUPLICATE KEY UPDATE 1=1"; 

Это оставляет меня с SQL заявление выглядит как это:

INSERT 
    INTO 
     tblTwitterSubmit (tweetId, twitterAuthor, authorAvatar, tweetText, tweetDateTime) 
    VALUES 
    (111,'name','http://url.com','a string of text','03-04-2011 13:03:09'), 
    (222,'anothername','http://url.com','another tweet','03-04-2011 12:03:51') 
ON DUPLICATE KEY UPDATE 1=1; 

Я, к сожалению, получив следующую ошибку: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1=1' at line 1.

Редактировать: 1 = 1 не должен ничего делать. Твиты не меняются, поэтому, если по какой-то причине я вытаскиваю одну и ту же спину дважды, ничего не произойдет, но она также не вызовет дублируемую ключевую ошибку.

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

Я все-таки пересчитал код, так как показалось, что то, что я читал в статьях как «действительно хорошая идея», не было. Теперь я включил PDO submit внутри цикла for, поэтому я просто делаю кучу представлений вместо одной длинной строки sql.

Надеюсь, это лучшая практика.

Оставив это открытым на пару минут, надеясь на некоторую обратную связь, если это способ сделать это или нет.

+1

Что конкретно 1 = 1? Я не эксперт MySQL, но для меня это выглядит бесполезным (и, возможно, недопустимым синтаксисом) для меня ... –

+0

@ rlb.usa: быстрый взгляд на инструкцию SQL, опубликованную OP, показывает, что это не так. – mellamokb

+0

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

ответ

2

Вы уверены, что используете правильный синтаксис для on duplicate key update?

Судя по его руководству, кажется, вам нужно указать имя столбца, а не 1=1.


Из того, что я понимаю, если вы хотите, чтобы указать «использовать значение из значений() положение, когда есть дубликат», вы должны использовать что-то вроде этого:

on duplicate key update your_col=values(your_col) 

Цитируя соответствующая часть:

You can use the VALUES(col_name) function in the UPDATE clause to refer to column values from the INSERT portion of the INSERT ... ON DUPLICATE KEY UPDATE statement.

In other words, VALUES(col_name) in the ON DUPLICATE KEY UPDATE clause refers to the value of col_name that would be inserted, had no duplicate-key conflict occurred.

This function is especially useful in multiple-row inserts.


Тогда как заметка на полях, вы должны экранировать ваши строки, используя функция, соответствующая вашему API - возможно, mysql_real_escape_string - а не общие аддоны, которые не знают о специфике вашего механизма базы данных.

+0

Благодарим вас за эту вторую часть, хотя добавочные знаки там только как заполнитель. Я изначально написал инструкцию с использованием PDO, поэтому я не могу использовать mysql_real_escape. Он будет исправлен до того, как я закончу код. –

+0

OK :-) Использование подготовленных заявлений еще лучше! –

4

ON DUPLICATE KEY UPDATE требует названия столбца, что-то вроде этого, предполагая, что tweetId является ключевым столбцом, который получает дубликаты.

ON DUPLICATE KEY UPDATE tweetId=tweetId+1 

Ваш 1=1 на самом деле не делать ничего.

0

Проблема, похоже, связана с ключевым полем, которое я использовал, которое было идентификатором твита, назначенным твиттером.

Я все-таки пересчитал код, так как показалось, что то, что я читал в статьях как «действительно хорошая идея», не было.Я теперь включил PDO submit внутри цикла for, так что я просто

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