2016-02-20 2 views
0

Я знаю, что эта проблема уже существует, но я не могу понять, как ее решить в моем случае. Я пытаюсь использовать оператор UPDATE с sql, но у меня проблема при работе с краткими строками.php - update sql statement с краткими строками

Это мой код:

$body = file_get_contents('php://input'); 
$jsonArray = json_decode($body, true); 

$sql = array(); 
foreach ($jsonArray as $row) { 

    $sql[] = '("'.$row['firstname'].'", "'.$row['lastname'].'", "'.$row['sex'].'", "'.$row['dateOfBirth'].'", "'.$row['email'].'")'; 

} 

$column_name = "(firstname, lastname, sex, dateOfBirth, email)"; 
$stringImplode = implode(',', $sql); 

$action = $mysqli->query('INSERT INTO tbl_syncList '. $column_name .' VALUES '.$stringImplode .'ON DUPLICATE KEY UPDATE XXXXXXX'); // --> I get stuck here 

Я не знаю, как я должен писать после KEY UPDATE ON DUPLICATE: Я знаю, что это должно быть что-то вроде "column_name = value1, column_name2 = значение2 ..." но можно ли использовать массивы выше так, как «(column_name1, column_name2 ...) = (value1, value2 ...), которые могли бы быть полезными, если бы я добавлял атрибуты multiples?

Поскольку это находится за пределами цикла. Я не уверен, как ссылаться на мое значение внутри массива sql [], так как у меня могло быть много другого значения для одного и того же имени_ column_name.

Кроме того, я хотел бы добавить ИНЕКЕ в конце что-то вроде «ГДЕ timestamp_column_name < timestamp_value», но я не знаю, если это возможно ..

Если кто-то может помочь мне решить эту проблему это было бы прекрасно.

ответ

1

Чтобы ответить на ваш первый вопрос, вы можете использовать VALUES() в KEY UPDATE заявления дублирования:

$action = $mysqli->query('INSERT INTO tbl_syncList '. $column_name .' VALUES '.$stringImplode .'ON DUPLICATE KEY UPDATE firstname = VALUES(firstname), lastname = VALUES(lastname), sex = VALUES(sex), dateofbirth = VALUES(dateofbirth), email = VALUES(email)'); 

Однако, я не думаю, что ваша вторая проблема может быть решена с помощью этого подхода. Моя рекомендация состояла в том, чтобы сначала вставить все записи в промежуточную таблицу, которая не имеет каких-либо уникальных ограничений для столбцов, которые вы вставляете/обновляете. Затем используйте дополнительные запросы (или предпочтительно процедуру базы данных) для выполнения отдельных запросов на обновление и вставку на основе соединения между таблицами и любых других критериев, которые у вас есть.

Мой MySQL немного ржавый, но я думаю, что это должно быть примерно то, что вам нужно, как только вы вставили данные в промежуточную таблицу:

UPDATE a 
SET a.firstname = b.firstname, 
    a.lastname = b.lastname, 
    a.sex  = b.sex, 
    ... 
FROM stagingtable b 
JOIN tbl_syncList a ON a.idcolumn = b.idcolumn 
WHERE b.timestamp > a.timestamp 

INSERT tbl_syncList(firstname, lastname, sex, dateOfBirth, email) 
SELECT 
    b.firstname, 
    b.lastname, 
    b.sex, 
    b.dateOfBirth, 
    b.email 
FROM stagingtable b 
LEFT JOIN tbl_syncList a ON a.idcolumn = b.idcolumn 
WHERE a.idcolumn IS NULL 
+0

Спасибо Я попробовать! – Trichophyton

+0

Вы правы. Я не могу использовать тот же подход для обновления данных. Но я не понимаю, почему он не мог работать с условием WHERE следующим образом: ON DUPLICATE KEY UPDATE firstname = VALUES (firstname), ... WHERE timestamp (то есть имя базы данных column_name) Trichophyton

+0

Я не уверен, чтобы понять, что такое таблица «a» в вашем примере, это мой tbl_syncList происхождения? Или есть более двух таблиц? – Trichophyton

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