MySqli Подготовленные операторы вставляются с использованием now () и удаляются в зависимости от времени - PullRequest
0 голосов
/ 28 января 2012

Я потратил 4 часа, пытаясь записать простую вставку даты и времени в БД, перечитать это значение и посмотреть, сколько времени прошло.Я видел ужасающий пример за примером в PHP (у моего провайдера есть только PHP 5.2.1), а не 5.3.Ну, после нескольких часов чтения .. Я нашел решение, которое делает меня счастливым, но я не знаю, как заставить его работать так, как мне нужно, чтобы оно работало ... код ...

create temporary table Data
( dt DateTime );

insert Data values
    (now() - INTERVAL 23 MINUTE);

select
    TIME_FORMAT(
      TIMEDIFF(now(), dt)
     ,'%i minute(s) ago'
   )
from Data;

Я использую ПОДГОТОВЛЕННЫЕ операторы (PS) ... Я не знаю, как преобразовать это в процедурный стиль, PS.Я думал, а не?Я бы поставил сейчас (), но тогда я понятия не имел, что поставить в значение.Я также подумал ... я просто поменяю БД на INT, а затем просто вставлю туда значение PHP time () и сделаю кое-что по математике, когда прочитаю.Это мой другой вариант, но ... это заставит SQL выполнять "работу", так что ... это можно преобразовать в PS?

Спасибо!

Все, что я хочу сделать, это ...

обновить запись с помощью now (), ПОТОМ выяснить, сколько времени прошло с тех пор, как я написал эту запись, и удалить ее, если прошло достаточно времени.

Веб-сайт, на котором показан код, указанный выше, работает ...

http://sqlize.com/r1mlXcM62V

1 Ответ

0 голосов
/ 29 января 2012

Это был целый день борьбы, чтобы понять все это, и похоже, что я сделал это. Странно то, что SQL на самом деле очень прост, а PHP очень прост. Я стар, и мой мозг ржавый (запрограммированный на 17+ лет). Я представляю, как это должно работать в моей голове, и что-то, что должно занять несколько секунд, занимает часы, чтобы исследовать и выяснить. ТАК ... Я нашел решение ...

$query = "SELECT TIMESTAMPDIFF(MINUTE, `sesstoken1created`,now()) FROM pcssecurity";

за исключением того, что я должен изменить его на оператор DELETE, поэтому я подумал ...

$query = "DELETE FROM pcssecurity WHERE TIMESTAMPDIFF(MINUTE, `sesstoken1created`,now()) > 16";

Это удалит все найденные метки времени> 16 минут. Работает. Я также исследовал, что делать, если бы не было НИКАКИХ переменных для связывания ... Было бы нормально не включать переменные BIND ... и, видимо, это работает без переменных связывания.

РЕШЕНИЕ

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_USER_PASSWORD, DB_NAME) or die(DB_CONNECT_ERROR .  __LINE__);
$stmt = mysqli_stmt_init($dbc);

$query = "DELETE FROM tablename WHERE TIMESTAMPDIFF(MINUTE, `datetimefieldhere`,now()) > " . SESSION_TOKEN_EXPIRES_IN_MINUTES;
$result = mysqli_stmt_prepare($stmt, $query);
$result = mysqli_stmt_execute($stmt);
$result = mysqli_stmt_affected_rows($stmt);

if ($result === -1) { // some error happened
    die('CreateNewToken insert failed');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...