В функции last_sale сделал array_unique() , но результат остался тот же PHP: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); if ( ! function_exists('last_sale_review')) { function last_sale_review() { $ci=& get_instance(); $ci->load->database(); $ci->db->select("id"); $ci->db->select("goods_id"); $ci->db->select("name"); $ci->db->select("price"); $ci->db->select("images"); $ci->db->from("last_sale"); $ci->db->order_by("id", "desc"); $ci->db->limit(4); $comments = $ci->db->get(); $comments = $comments->result(); return $comments; } } if ( ! function_exists('last_sale')) { function last_sale($name,$goods_id,$price,$images) { $ci=& get_instance(); $ci->load->database(); $input = array( "id" => "", "goods_id" => "$goods_id", "name" => "$name", "price" => "$price", "images" => "$images"); $result = array_unique($input); $ci->db->insert('last_sale', $result); } } --- Добавлено --- Нужно обвернуть функцию "last_sale_review" в другую функцию? И в ней прописать уже этот array_unique() ? В ту сторону копаю?
Ладно, тогда просто бросаю скрипт который был изначально. PHP: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); if ( ! function_exists('last_sale_review')) { function last_sale_review() { $ci=& get_instance(); $ci->load->database(); $ci->db->select("id"); $ci->db->select("goods_id"); $ci->db->select("name"); $ci->db->select("price"); $ci->db->select("images"); $ci->db->from("last_sale"); $ci->db->order_by("id", "desc"); $ci->db->limit(4); $comments = $ci->db->get(); $comments = $comments->result(); return $comments; } } if ( ! function_exists('last_sale')) { function last_sale($name,$goods_id,$price,$images) { $ci=& get_instance(); $ci->load->database(); $data = array( "id" => "", "goods_id" => "$goods_id", "name" => "$name", "price" => "$price", "images" => "$images" ); $ci->db->insert('last_sale', $data); } } И на выводной странице вставлен код: PHP: <div class="container1"> <div class="main"> <?php $this->load->helper('last_sale'); if(count(last_sale_review())) : foreach(last_sale_review() as $top): ?> <?php $img_prop=array( 'src'=> '/uploads/' . $top->images, 'width' => 155, 'height' => 72, 'alt' => htmlspecialchars($top->name)); ?> <a href="<?php echo '/goods/'.$top->goods_id; ?>"> <div class="view view-eighth"> <?php echo img($img_prop); ?> <div class="price-lastsale"> <?php echo $top->price; ?> <i class="fa fa-rub" aria-hidden="true"></i></div> <div class="mask"> <h2><?php echo $top->name; ?></h2> </div> </div> </a> <div class="clear"></div> <?php endforeach; endif; ?> </div></div> Как сделать так, что бы не повторялся вывод одинаковых товаров?
Спасибо за ответ! Но так вообще не добавляет в список после перехода на order. Может вообще скрипт стоит переписать? Он какой-то кривой. У других добавляется лишь после того, когда совершат оплату. А у меня после того, как перекинет на страницу оплаты
last_sale нужно переместить в место где оплата происходит, после проверки факта оплаты. но last_sale_review все равно будет возвращать одинаковые товары сделайте запрос в phpmyadmin: Код (Text): select id, goods_id, name, price, images from last_sale group by goods_id order by id desc limit 4 и сюда ошибку или можно попробывать еще вот так: вместо $ci->db->select("goods_id"); > $ci->db->select("distinct(goods_id)"); но я фиг знает, что этот конструктор запросов в итоге склеет за запрос. имхо все что сложнее "select * from table where id = 2" должно писаться в plain sql, а не через конструкторы, которые в каждом движке разные
Дело в том, что оплата происходит на независимом сервисе Oplata.Info , по этому видимо и принял такое решение разработчик. После перехода на этот сервис, засчитывает как продажу. Написал вместо $ci->db->select("goods_id"); > $ci->db->select("distinct(goods_id)"); На сайте в выводе ошибки Жаль я не понимаю в функциях и пабликах PHP и JQuery, вряд ли смогу причину, а уж тем более вряд ли смогу переписать весь скрипт. Код (Text): A Database Error Occurred Error Number: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'distinct(goods_id), `name`, `price`, `images` FROM (`last_sale`) ORDER BY `id` d' at line 1 SELECT `id`, distinct(goods_id), `name`, `price`, `images` FROM (`last_sale`) ORDER BY `id` desc LIMIT 4 Filename: /home/last_sale_helper.php Line Number: 17 Сделал Ваш запрос в phpmyadmin, выдало пустую строку: Код (Text): MySQL вернула пустой результат (т.е. ноль строк). (Запрос занял 0.0009 сек.) selectid,goods_id,name,price,imagesfromlast_salegroupbygoods_idorderbyiddesclimit4
да distinct первым должен идти, если не получится пишите) типо так: SELECT distinct(goods_id), `id`, `name`, ..... а не так: SELECT some1, some2, ....someN...distinct(goods_id)
Извините, я не понял вообще что Вы попросили сделать Я пробовал: Код (Text): if ( ! function_exists('last_sale_review')) { function last_sale_review() { $ci=& get_instance(); $ci->load->database(); $ci->db->select("id"); $ci->db->select("distinct(goods_id)"); $ci->db->select("name"); $ci->db->select("price"); $ci->db->select("images"); $ci->db->from("last_sale"); $ci->db->order_by("id", "desc"); $ci->db->limit(4); $comments = $ci->db->get(); $comments = $comments->result(); return $comments; } } А как и куда писать SELECT distinct(goods_id), `id`, `name`, ..... я что то не понял Это в phpmyadmin? Как там добавить Distinct? ) Я вижу что в ошибке у меня выбило строку о которой Вы говорите. Но как сменить местами? --- Добавлено --- А, вот сменил "поля" в phpmyadmin, но результат тот же. Повторяются результаты) --- Добавлено --- Попробовал в phpmyadmin перенести строки местами, на первое место GOODS_ID, а так же в конструкторе первым поставил Goods_id, ошибка пропала, но результат тот же, товар повторяемый выводится PHP: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); if ( ! function_exists('last_sale_review')) { function last_sale_review() { $ci=& get_instance(); $ci->load->database(); $ci->db->select("distinct(goods_id)"); $ci->db->select("id"); $ci->db->select("name"); $ci->db->select("price"); $ci->db->select("images"); $ci->db->from("last_sale"); $ci->db->order_by("id", "desc"); $ci->db->limit(4); $comments = $ci->db->get(); $comments = $comments->result(); return $comments; } } if ( ! function_exists('last_sale')) { function last_sale($name,$goods_id,$price,$images) { $ci=& get_instance(); $ci->load->database(); $data = array( "goods_id" => "$goods_id", "id" => "", "name" => "$name", "price" => "$price", "images" => "$images" ); $ci->db->insert('last_sale', $data); } }
да, я про конструктор в php (а в самой базе лучше вернуть все как было). если хотите скиньте доступ на фтп в личку, посмотрю (или скиньте дамп этой таблцицы и напишите что это за движок, codeignater вроде?)
При всем уважении к Вам и Вашей помощи, я очень благодарен Вам, что Вы единственный пытаетесь мне помочь! Но сайт в рабочем состоянии, и доступ к нему максимально защищен Это так званый "говно-код" от ytstyle, они пишут скрипты с шаблонами который подключается к системе "Digiseller". Брал я его в открытом доступе года два назад, и спустя такое время уже давно все переработал под себя, в том числе естественно и дизайн. Но баг с продажами так и остался. Здесь либо нужно переписать скрипт полность, связать как-то с БД, что бы он видел когда наличие товара уменьшается, а значит товар продался. Либо же хотя бы просто сделать вывод только уникального значения. У меня сохранились файлы оригинал в исходном состоянии. Как раз есть именно модуль последних продаж. Прикрепляю .zip P.S. Обратите внимание на файл confirm_buying.php , забавный файл. Может проблема решается именно в нем? Так же в order.php упоминаются некие token переменный, который находятся в confirm_buying.php вроде бы. В общем Вам виднее что там и как Напутано все для меня --- Добавлено --- На всякий случай, вставлю функцию из confirm_buying.php сюда PHP: if ($_POST['token'] == $_SESSION['lastToken']) { header('Location: /'); } else { $_SESSION['lastToken'] = $_POST['token'];{ if($movie_info[0]->in_stock == "y"){ $this->load->helper('top10'); $this->load->helper('last_sale'); $top_id = ($_POST["id_goods"]); $goods_id = $movie_info[0]->digiseller_id; $name = $movie_info[0]->goods_title; $price = $movie_info[0]->price; $images = $movie_info[0]->thumbnail; top10_review($top_id); last_sale($name,$goods_id,$price,$images); $redirect = 'http://www.oplata.info/asp/pay_wm.asp?id_d='.($_POST["id_goods"]).'&curr='.($_POST["type_curr"]).'&agent='.($_POST["id_agent"]).'&failpage='.($_POST["failpage"]).''; header('Location: '.$redirect.''); }else{ header('Location: /'); }; }}
Код (Text): select lt1.* from last_sale as lt1 inner join (select goods_id, max(id) id from last_sale group by goods_id) as lt2 on lt1.id = lt2.id and lt1.goods_id = lt2.goods_id order by lt1.id desc limit 3 вот так попробуйте в phpmyadmin (если эт то что нужно, пришлю как это в пхп встаивть) по поводу confirm_buying. там идет редирект на сервис оплаты. нормальные платежные системы позволяют передать success и fail url, чтобы оповестить сайт о факте оплаты (удачной или не удачной), а там я вижу только fail url (и на сайте oplata.info не нашел вообще никакой документации)
В phpmyadmin я наживаю вкладку SQL, верно? ) Ответ: Код (Text): MySQL вернула пустой результат (т.е. ноль строк). (Запрос занял 0.0027 сек.) select lt1.* from last_sale as lt1 inner join (select goods_id, max(id) id from last_sale group by goods_id) as lt2 on lt1.id = lt2.id and lt1.goods_id = lt2.goods_id order by lt1.id desc limit 3
нет, что то не то. я заполнил, вашу таблицу у себя фейковыми записями: Код (Text): -- Adminer 4.2.5 MySQL dump SET NAMES utf8; SET time_zone = '+00:00'; SET foreign_key_checks = 0; SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; DROP TABLE IF EXISTS `last_sale`; CREATE TABLE `last_sale` ( `id` int(11) NOT NULL AUTO_INCREMENT, `goods_id` int(11) NOT NULL, `name` varchar(255) NOT NULL, `price` int(11) NOT NULL, `images` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `last_sale` (`id`, `goods_id`, `name`, `price`, `images`) VALUES (1, 1, 'товар 1', 111, 'картинка товара 1'), (2, 2, 'товар 2', 222, 'картинка товара 2'), (3, 1, 'товар 1', 111, 'картинка товара 1'), (4, 2, 'товар 2', 222, 'картинка товара 2'), (5, 2, 'товар 2', 222, 'картинка товара 2'), (6, 2, 'товар 2', 222, 'картинка товара 2'), (7, 2, 'товар 2', 222, 'картинка товара 2'), (8, 2, 'товар 2', 222, 'картинка товара 2'), (9, 2, 'товар 2', 222, 'картинка товара 2'), (10, 3, 'товар 3', 333, 'картинка товара 3'); -- 2017-07-21 12:45:08 и когда я делаю запрос(что прислал вам) результат у меня такой: Код (Text): id goods_id name price images 10 3 товар 3 333 картинка товара 3 9 2 товар 2 222 картинка товара 2 3 1 товар 1 111 картинка товара 1 а у вас почему то пусто... какая версия mysql у вас?( select version(); )
Блин, на Вашем примере круто получилось, то что нужно. А у меня почему то пустая строка, хм. phpMyAdmin Информация о версии:4.6.6 По запросу: Код (Text): Отображение строк 0 - 0 (1 всего, Запрос занял 0.0002 сек.) select version() + Параметры version() 10.0.31-MariaDB-cll-lve
предчувствую что дело в том что у вас не mysql --- Добавлено --- у меня была где-то mariadb установлена дома, приду попробую
Ааааа! Дак у меня база данных пустая! Я не понимаю как так. Давно еще замечал. Там лишь разметка таблиц. А товары там не хранятся.
это у вас вкладка структура, а данные во кладке обзор(ну и она не может быть пустой, если у вас одинаковые товары выводятся, была бы пустая, вообще ничего не выводилось бы ))
Ой, товары хранятся в Items! Но там всего лишь пару штук их, шли как образцы во время установки БД. А с сайтом они не обновляются. Там те товары, которые удалены у меня на сайте. А так же новых нет, которых очень много! По этому, даже если мы и сделаем этот скрипт, я не знаю, будет ли он отображать новые товар! Здесь вообще криворукий создавал кто-то --- Добавлено --- Вот, понимаете? 19 штук! У меня на сайте около 300 товаров вообще-то Я не знаю, с чем это связано. Эта проблема была еще когда я даже ничего не изменял на сайте под себя. Она изначально не добавляла товары в БД. На хосте вроде как держит данные
ну вот конкретно в функции вывода последних покупок которую мы ковыряем, эта таблица и не задействуется. а где-то еще да.... это может быть проблемой
Результат с запроса? Или всетаки вывод? Бросаю и то и то Код (Text): MySQL вернула пустой результат (т.е. ноль строк). (Запрос занял 0.0006 сек.) select * from last_sale order by id desc limit 10 Вывод на странице home.php: PHP: <div class="main"> <?php $this->load->helper('last_sale'); if(count(last_sale_review())) : foreach(last_sale_review() as $top): ?> <?php $img_prop=array( 'src'=> '/uploads/' . $top->images, 'width' => 155, 'height' => 72, 'alt' => htmlspecialchars($top->name)); ?> <a href="<?php echo '/goods/'.$top->goods_id; ?>"> <div class="view view-eighth"> <?php echo img($img_prop); ?> <div class="price-lastsale"> <?php echo $top->price; ?> <i class="fa fa-rub" aria-hidden="true"></i></div> <div class="mask"> <h2><?php echo $top->name; ?></h2> </div> </div> </a> <div class="clear"></div> <?php endforeach; endif; ?> </div>
вы вводите меня в заблуждение )) этого БЫТЬ НЕ МОЖЕТ !) - MySQL вернула пустой результат (т.е. ноль строк). (Запрос занял 0.0006 сек.) вероятно база в которую вы делаете запрос через phpmyadmin отличается о той с которой работает ваш сайт. может вы загрузили сайт к себе локально, там проводите тесты, но недоконца загрузили базу?)) --- Добавлено --- я имею ввиду что если у вас что-то выводится в этом блоке: Код (Text): <div class="main"> <?php $this->load->helper('last_sale'); if(count(last_sale_review())) ..... </div> то этого - не может быть
Ёлеки палки! Я просто арендую два хоста, на одном провожу тесты и всякие разработки. А на втором стоит рабочий сайт. И оказывается на рабочем сайте, указана БД с тестового хоста. Дико прошу прощения! Но и спасибо, а то и не нашел бы ошибку эту Там вся БД забита товарами которые есть на сайте. И результаты теперь отображаются все. Вы просили сделать запрос: Код (Text): select * from last_sale order by id desc limit 10 Сделал, ответ верный там, 10 последних товаров, которые повтоярются. Спойлер: СКРИНШОТ До этого Вы просили сделать: Код (Text): select lt1.* from last_sale as lt1 inner join (select goods_id, max(id) id from last_sale group by goods_id) as lt2 on lt1.id = lt2.id and lt1.goods_id = lt2.goods_id order by lt1.id desc limit 3 но я лимит увеличил до 10, и УРА, сработало! На скрине видно, что повторяющихся элементов нет. Спойлер: СКРИНШОТ 2 Выходит остается лишь Вам сказать как мне сделать в PHP этот запрос!