Мне нужно отфильтровать данные в таблице, удалив «последние два часа». Я импортирую данные, загружая CSV, который не могу изменить, и использую только 3 поля. одно из полей - datetime, но импортируется как строка - 05 Dec 2018 22:20 Мне нужно как-то посчитать последние два часа формы и удалить их из таблицы. Я пробовал str to date в mysql, но продолжаю получать ошибку, недопустимое значение datetime, я пробовал strtotime в php, но то же самое .. Неважно, как он удаляется при импорте csv. Я использую его для импорта.
<?php
include('connection.php');
$con = getdb();
if (isset($_POST["Import"])){
echo $filename=$_FILES["file"]["tmp_name"];
if ($_FILES["file"]["size"] > 0)
{
$file = fopen($filename, "r");
$getData = fgetcsv($file, 10000, ",");
while (($getData = fgetcsv($file, 10000, ",")) !== FALSE)
{
$getData = str_replace("'","''",$getData);
$sql = "INSERT into test2 (type_ID,name,Last_Contact) values ('".$getData[3]."','".$getData[4]."','".$getData[12]."')";
// $sql = "INSERT into test2 (date) = STR_TO_DATE(Last_Contact, '%d %b %Y %H:%i')";
$result = mysqli_query($con, $sql);
var_dump(mysqli_error_list($con));
//exit();
if (!isset($result))
{
echo "<script type=\"text/javascript\">
alert(\"Invalid File:Please Upload CSV File.\");
window.location = \"index.php\"
</script>";
// $sql = "INSERT into test2 (date) = STR_TO_DATE(Last_Contact, '%d %b %Y %H:%i')"; this part if unmasked returns error
Какие-либо предложения?
Правильный отступ в коде имеет большое значение.
Вам следует научиться использовать подготовленные операторы вместо подстановки переменных в строку SQL. Тогда вам не нужно было бы удваивать кавычки.
Вы не должны вставлять дату отдельным запросом. Это поместит дату в другую строку из других полей.
@Barmar, я не против, даже лучше. Я проверил предложенный вами запрос, но продолжаю получать ошибки Предупреждение: mysqli_prepare () ожидает ровно 2 параметра, 1 из которых указан в / var Предупреждение: mysqli_stmt_bind_param () ожидает, что параметр 1 будет mysqli_stmt, значение null указано в / var
Я забыл аргумент $con для mysqli_prepare().
@bramar спасибо, работает как шарм .. теперь я могу продолжать удалять определенные строки из таблицы в зависимости от времени






Вы должны использовать подготовленное заявление. Проблема в том, что вы не вызываете STR_TO_DATE() в строке, которую вы только что вставили в таблицу. Ваш второй запрос INSERT не имеет никакого отношения к предыдущему, поэтому он не может получить доступ к столбцу Last_Contact, который вы только что вставили.
Вы должны вызвать STR_TO_DATE() для строки, которую вы прочитали из CSV, а не для столбца таблицы, так как вам нужно вставить это в ту же строку.
Вам также следует использовать подготовленный оператор, а не объединять переменные.
$type_id = $name = $date = null;
$stmt = mysqli_prepare($con, "INSERT INTO test2 (type_ID, name, Last_Contact, date) VALUES (?, ?, ?, STR_TO_DATE(?, '%d %b %Y %H:%i'))");
mysqli_stmt_bind_param($stmt, "ssss", $type_id, $name, $date, $date);
while ($getData = fgetcsv($file, 10000, ",")) {
$type_id = $getData[3];
$name = $getData[4];
$date = $getData[12];
mysqli_stmt_execute($stmt);
}
--update, и я считаю, что легко удалил бы, если бы у меня было правильное datetime