Работа с брошенной корзиной

artoodetoo

великий и ужасный
Реально здесь нет проблемы. В тот момент когда корзина сохраняется, явно или неявно, она попадает в базу и получает свой идентификатор. Который можно использовать в ссылке.

Даже если до сих пор корзина существовала только в локалСторадж, теперь у неё есть тень на сервере из которой можно создать дубль где угодно.
 
Последнее редактирование:

artoodetoo

великий и ужасный
@ksnk, видел нечто подобное на каком-то рент-а-каре. Посетителю предлагалась ссылка с результатом поиска. Срок жизни 24 часа вроде обещался.
 

peretc001

Новичок
Проблема в том, что email определяется js кодом, и известен только сервису retailrocket
В БД он не записывается. Вот если бы можно было дописать email к сессии
Email определяется кодом
HTML:
<input type="email" name="email" onblur="var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;if(regex.test(this.value)) { try {rrApi.setEmail(this.value);}catch(e){}}"/>
Есть ли возможность записать данные с intup в БД после его заполнения и без нажатия кнопки отправить?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@peretc001, есть, по событию изменения поля посылать AJAX запрос
 

peretc001

Новичок
так?
PHP:
<form .....>
<input id="email" type="email" class="zakaz" name="email" onblur="var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;if(regex.test(this.value)) { try {rrApi.setEmail(this.value);}catch(e){}}"/>
...
</form>
<script>
                            $(function(){
                                var ajax_timeout=false, delay_beforesend=3000;
                           
                                function sendForm(){
                                   $.ajax({
                                     url:'/shop/inc/addtocart_email.php',
                                     data:"email="+$("#email").val(),
                                     method:'post'
                                   })
                                }
                                $(document).change('#email',function(){
                                    if(ajax_timeout) clearTimeout(ajax_timeout);
                                    ajax_timeout=setTimeout(sendForm,delay_beforesend)
                                })  
                            });
                        </script>
 

peretc001

Новичок
Решил пока так.

Если email неизвестен, то при изменении поля input email записываем его в базу
PHP:
<?php
$query=mysql_query("SELECT * FROM cart WHERE sid = '". session_id() ."'  ");
                        $query=mysql_fetch_assoc($query);

                        #Если email НЕизвестен
                        if ($query['email'] == '') { ?>
                            <input id="email" type="email" class="zakaz" name="email" onblur="var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;if(regex.test(this.value)) { try {rrApi.setEmail(this.value);}catch(e){}}"/>
                            <script>
                                $(function(){
                                    var ajax_timeout=false, delay_beforesend=3000;
                               
                                    function sendForm(){
                                       $.ajax({
                                         url:'/shop/inc/addtocart_email.php',
                                         data:"email="+$("#email").val(),
                                         method:'post'
                                       })
                                    }
                                    $(document).change('#email',function(){
                                        if(ajax_timeout) clearTimeout(ajax_timeout);
                                        ajax_timeout=setTimeout(sendForm,delay_beforesend)
                                    })  
                                });
                            </script>
                        <?php } >
Отправляем клиенту ссылку на отдельный файл вида site.ru/shop/[email protected]
Сам файл abandonedcart.php берет текущую сессию и изменяет старую на новую и отправляет на корзину
PHP:
<?php session_start();
include ("../inc/config.php");
// Достаем email
    $email = htmlspecialchars(trim($_GET['email']));
  
    $query = mysql_query("SELECT * FROM cart WHERE email = '$email' ");
    $query = mysql_fetch_assoc($query);
  
    $result = mysql_query("UPDATE `cart` SET sid = '". session_id() ."' WHERE email = '$email' ");
  
    echo '<script language="JavaScript">window.location.href = "/shop/shoppingcart.php"</script>';  
?
Теперь нам известен его email. Убираем из корзины функцию захвата email
PHP:
<?php #Если email известен
                        else { ?>
                            <input type="email" class="zakaz" name="email" value="<?php echo $query['email']; ?>"/>
                        <?php } ?>
Таким образом можно заходить с любого браузера, корзина будет именно та что нужна :)
 

ksnk

прохожий
@peretc001, Я правильно понимаю, что достаточно любому человеку в инпут вбить любой email, чтобы узнать про владельца этого адреса - покупал ли он что-то в магазине и что конкретно в последний раз?
 

AnrDaemon

Продвинутый новичок
@peretc001, Я правильно понимаю, что достаточно любому человеку в инпут вбить любой email, чтобы узнать про владельца этого адреса - покупал ли он что-то в магазине и что конкретно в последний раз?
Мгновенно возник тот же вопрос.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
только вот название раздела "PHP & JavaScript & AJAX & HTML" не подразумевает, что все это идет лапшой в одном файле =))
 

peretc001

Новичок
@peretc001, Я правильно понимаю, что достаточно любому человеку в инпут вбить любой email, чтобы узнать про владельца этого адреса - покупал ли он что-то в магазине и что конкретно в последний раз?
Я сейчас на стадии корзины. На данный момент я знаю email посетителя (если он его ввел) и что он положил в корзину.
А вот если он отправляет заказ, то на странице оформленного заказа вы можете (и мне надо будет) сверять адрес email, чтобы не отправлять письма о брошенной корзине если посетитель оформил заказ.

А написал я в этой теме, т.к. думал что кроме PHP нужна будет кучу скриптов :)
 

peretc001

Новичок
А подскажите, такой вопрос. Вот я получил email, записал в базу. А есть ли функция которая отправляет письмо о брошенной корзине скажем через 24 часа, а потом через 72. (как отправить письмо я знаю, а как отправить с задержкой?) И учесть при этом что адрес может быть отписан от рассылки или после первого письма произошла покупка.
 

artoodetoo

великий и ужасный
@peretc001, в языке такой функции нет.

@peretc001, Я правильно понимаю, что достаточно любому человеку в инпут вбить любой email, чтобы узнать про владельца этого адреса - покупал ли он что-то в магазине и что конкретно в последний раз?
Эту проблему можно решить через "активацию" письмом. Ссылка на брошенную корзину отправляется на указанный адрес.
 

peretc001

Новичок
нашел функцию sleep();
PHP:
<?php $db->query("INSERT INTO email SET ?u", $data );
?>
<p class="ok">Адрес успешно добавлен!</p>
<?php
sleep(120);
    // Отправляем письмо админу
    $to  = "...";
    $subject = 'Email';
    $message .= 'Email: '. $_POST['email'];
    $message .= '<br>Category: '. $_POST['category'];
    $headers  = "Content-type: text/html; charset=utf-8 \r\n";
    $headers .= "From: ... <...>\r\n";
        mail($to, $subject, $message, $headers);
Но она задерживает выполнение всего файла. А он у меня загружается через ajax. И получается страница зависает на 2 минуты, а потом появляется надпись "Адрес успешно добавлен!"
Есть ли возможность отправить данные в сторонний файл а там уже отправлять письмо?
 

artoodetoo

великий и ужасный
То есть ты хотел оставить скрипт спать 24 часа? OMG
Даже боюсь подсказывать как можно родить параллельный процесс. Забудь про sleep, сотри это из своей памяти.
 

artoodetoo

великий и ужасный
Ты можешь придумать пулл заданий на определенное время и регулярно проверять эту очередь. Задания со временем старше текущего выполняешь и удаляешь.
При наличии cron можешь проверять очередь каждую минуту, при отсутствии cron можешь делать это в каждом запросе (т.е. на каждой страничке).
 
Последнее редактирование:

peretc001

Новичок
Ты можешь придумать пулл заданий на определенное время и регулярно проверять эту очередь. Задания со временем старше текущего выполняешь и удаляешь.
При наличии cron можешь проверять очередь каждую минуту, при отсутствии cron можешь делать это в каждом запросе.
если я правильно понял, то нужен отдельный скрипт который постоянно мониторит данные из базы, если там появляется email то через 24 часа он отправляет письмо.
 

artoodetoo

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

peretc001

Новичок
ух ты, да он же у меня есть:) Планировщик задач, он же cron?
Да, уж. Нифига там не понятно :)
 

peretc001

Новичок
С созданием задач из планировщика разобрался.
А подскажите как создать cron задачу из того же php файла, которым я записываю email в базу.
 

artoodetoo

великий и ужасный
не надо создавать новые задачи крон, создавайте новые записи-задания в таблице.
а задачи довольно одной. вот такой:
если я правильно понял, то нужен отдельный скрипт который постоянно мониторит данные из базы, если там появляется email то через 24 часа он отправляет письмо.
как я писал, если слово "постоянно" следует понимать как "регулярно по расписанию". назначьте этот скрипт в крон один раз в нужный интервал времени.

заведите в таблице поле `планируемое время отправки` типа DATETIME и выбирайте
Код:
SELECT * FROM mail_queue WHERE NOW() >= planned_time
и не забывате чистить очередь
 
Сверху