Я бы хотел снять отпечатки пальцев с устройства и сохранить результат вместе с идентификатором сеанса в MariaDb. Я пишу на PHP, используя драйвер PDO. Я генерирую распечатанную клиентскую часть на посещенной странице и отправляю XHR в storePrint.php. Я хотел бы обновить существующие записи ИЛИ вставить новую, если они не существуют. Ниже приведен фрагмент исходного кода. Печать может уже существовать с другим идентификатором сеанса, и печать может измениться без изменения сеанса. Я хотел бы обновить отметку времени print, sessionId и lastVisited (которую я использую десятичную 14,4 и microtime (true) для этого, так что это не совсем отметка времени, но это другая касательная.
storePrint.php:
require_once('./library.php');
if(isset($_POST) && !empty($_POST))
{
$_POST = sanitize($_POST); // Clean up input.
$from = $_POST['from'];
$print = $_POST['clientPrint']; // max length = 32 characters
$sId = $_POST['sessionId']; // max-length = 64 characters
updatePrint($sId,$print,$from);
}
library.php:
function updatePrint($id,$print,$from)
{
$now = microtime(true);
$sql = "INSERT INTO prints (print,sessionId,lastUpdated) VALUES (:print,:sid,:lastC) ON DUPLICATE KEY UPDATE print=:print, sessionId = :sId, lastUpdated = :lastV";
$import = [":print" => $print,":sid" => $id,
":lastC" => $now,
":sId" => $id];// ":lastV" => $now,
$connection = connectToDB();
$statement = $connection->prepare($sql);
$result = $statement->execute($import);
$count = $statement->rowCount();
if($count > 0)
{
}else
{
echo 'Failure';
}
}
Печать генерируется на стороне клиента после загрузки документа и запуска XHR для storePrint.php. В надежде, что запись обновлена, или в случае, если этот print ИЛИ sessionId еще не существует, создается новыйПроблема в том, что print или sessionId могут меняться без других изменений. Мне нужно найти способ ( с использованием одного запроса, если возможно ), чтобы проверить, существует ли print или sessionId. Если существуетзатем обновите остальные (print, lastVisited в случае, если мы нашли запись с тем же идентификатором sessionId ИЛИ sessionId, lastVisited, если мы нашли совпадающую печать). Кто-то указал, что я, возможно, плохо спроектировал свою таблицу для того, что я хочу сделатьОбновление вызывает нарушение ограничений целостности. Так потеряно ... Я сделал идентификатор Primary с автоматическим приращением и напечатал униque и sessionId уникальны. Пожалуйста, подтолкните меня в правильном направлении. Другие запросы, которые я пытался использовать, были:
INSERT INTO prints (print, sessionId, lastUpdated) VALUES (:print,:sid,:lastC) CASE WHEN print <> :print THEN :print ELSE print END, last_update = CASE WHEN print <> :print THEN :lastV ELSE lastUpdated END;
INSERT INTO prints (print,sessionId,lastUpdated) VALUES (:print,:sid,:lastC) ON DUPLICATE KEY UPDATE print = CASE print WHEN <> THEN :print, ELSE print END, sessionId = CASE sessionId WHEN <> :sid THEN :sid ELSE sessionId END, lastUpdated=now()
и
INSERT INTO prints (print, sessionId, lastUpdated) VALUES (:print, :sid, :lastC) ON DUPLICATE KEY UPDATE lastUpdated = CASE WHEN print <> :print THEN :lastC ELSE lastUpdated END, print = CASE WHEN print <> :print THEN :print ELSE print END
Я обнаружил, что использование подготовленных операторов PDO и использование VALUE () вызывало у меня проблему синтаксиса, какон избежал бы уже экранированных строк, превратив их в-> VALUES ('' 88fe273778rs8s ... ''), после чего я вернулся к первому подготовленному утверждению и пришел сюда для направления ...
Итак, наконец, переписать ли запрос, перепроектировать таблицу или и то и другое ???
ОБНОВЛЕНИЕ: Фактическая проблема, с которой я сталкиваюсь, - это нарушение ограничения целостности в моем столбце sessionId. Я заканчиваю столкновением, когда печать совпадает с WHERE id=1
, а sessionId совпадает с WHERE id=14
MySQL решает, что собирается обновить id=1
, и вызывает ограничение целостности из-за дублирования sessionId. Как использовать от CASE
до DELETE
других соответствующих строк записи?