За последние 24 часа нас посетили 16909 программистов и 1646 роботов. Сейчас ищут 1014 программистов ...

Казалось бы проще простого array_unique() повторяющиеся значения

Тема в разделе "Сделайте за меня", создана пользователем promo20122, 18 июл 2017.

  1. promo20122

    promo20122 Активный пользователь

    С нами с:
    18 июл 2017
    Сообщения:
    16
    Симпатии:
    0
    В функции last_sale сделал array_unique() , но результат остался тот же

    PHP:
    1. if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    2.  
    3. if ( ! function_exists('last_sale_review')) {
    4.     function last_sale_review()
    5.     {
    6.         $ci=& get_instance();
    7.         $ci->load->database();
    8.      
    9.         $ci->db->select("id");
    10.         $ci->db->select("goods_id");
    11.         $ci->db->select("name");
    12.         $ci->db->select("price");
    13.         $ci->db->select("images");
    14.         $ci->db->from("last_sale");
    15.         $ci->db->order_by("id", "desc");
    16.         $ci->db->limit(4);
    17.         $comments = $ci->db->get();
    18.         $comments = $comments->result();
    19.      
    20.         return $comments;
    21.     }
    22. }
    23.  
    24. if ( ! function_exists('last_sale')) {
    25.     function last_sale($name,$goods_id,$price,$images)
    26.     {
    27.         $ci=& get_instance();
    28.         $ci->load->database();
    29.  
    30.  
    31.         $input = array(
    32.             "id" => "",
    33.             "goods_id" => "$goods_id",
    34.             "name" => "$name",
    35.             "price" => "$price",
    36.             "images" => "$images");
    37.         $result = array_unique($input);
    38.  
    39.  
    40.         $ci->db->insert('last_sale', $result);
    41.  
    42.     }
    43. }

    --- Добавлено ---

    Нужно обвернуть функцию "last_sale_review" в другую функцию? И в ней прописать уже этот array_unique() ? В ту сторону копаю?
     
    #1 promo20122, 18 июл 2017
    Последнее редактирование: 18 июл 2017
  2. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    Вообще непонятно действие с array_unique...только сплошные зачем и почему и чего хотите добиться.
     
  3. promo20122

    promo20122 Активный пользователь

    С нами с:
    18 июл 2017
    Сообщения:
    16
    Симпатии:
    0
    Ладно, тогда просто бросаю скрипт который был изначально.
    PHP:
    1. if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    2.  
    3. if ( ! function_exists('last_sale_review')) {
    4.     function last_sale_review()
    5.     {
    6.         $ci=& get_instance();
    7.         $ci->load->database();
    8.        
    9.         $ci->db->select("id");
    10.         $ci->db->select("goods_id");
    11.         $ci->db->select("name");
    12.         $ci->db->select("price");
    13.         $ci->db->select("images");
    14.         $ci->db->from("last_sale");
    15.         $ci->db->order_by("id", "desc");
    16.         $ci->db->limit(4);
    17.         $comments = $ci->db->get();
    18.         $comments = $comments->result();
    19.        
    20.         return $comments;
    21.     }  
    22. }
    23.  
    24. if ( ! function_exists('last_sale')) {
    25.     function last_sale($name,$goods_id,$price,$images)
    26.     {
    27.         $ci=& get_instance();
    28.         $ci->load->database();
    29.  
    30.         $data = array(
    31.             "id" => "",
    32.             "goods_id" => "$goods_id",
    33.             "name" => "$name",
    34.             "price" => "$price",
    35.             "images" => "$images"
    36.         );
    37.  
    38.         $ci->db->insert('last_sale', $data);
    39.  
    40.     }  
    41. }
    И на выводной странице вставлен код:

    PHP:
    1. <div class="container1">
    2.                     <div class="main">
    3.                     <?php $this->load->helper('last_sale'); if(count(last_sale_review())) : foreach(last_sale_review() as $top): ?>
    4.     <?php $img_prop=array( 'src'=> '/uploads/' . $top->images, 'width' => 155, 'height' => 72, 'alt' => htmlspecialchars($top->name)); ?>
    5.     <a href="<?php echo '/goods/'.$top->goods_id; ?>">
    6.                 <div class="view view-eighth">
    7.                    <?php echo img($img_prop); ?>
    8.                    <div class="price-lastsale">
    9.             <?php echo $top->price; ?>&nbsp;<i class="fa fa-rub" aria-hidden="true"></i></div>
    10.                     <div class="mask">
    11.                         <h2><?php echo $top->name; ?></h2>
    12.                      </div>
    13.                 </div>
    14.     </a>
    15.     <div class="clear"></div>
    16.     <?php endforeach; endif; ?>
    17. </div></div>
    Как сделать так, что бы не повторялся вывод одинаковых товаров?
     
  4. storms89

    storms89 Активный пользователь

    С нами с:
    20 июн 2016
    Сообщения:
    59
    Симпатии:
    10
    попробуй
    перед
    $ci->db->order_by("id", "desc");
    добавить
    $ci->db->group_by("goods_id");
     
  5. promo20122

    promo20122 Активный пользователь

    С нами с:
    18 июл 2017
    Сообщения:
    16
    Симпатии:
    0
    Спасибо за ответ! Но так вообще не добавляет в список после перехода на order. Может вообще скрипт стоит переписать? Он какой-то кривой. У других добавляется лишь после того, когда совершат оплату. А у меня после того, как перекинет на страницу оплаты :)
     
  6. storms89

    storms89 Активный пользователь

    С нами с:
    20 июн 2016
    Сообщения:
    59
    Симпатии:
    10
    last_sale нужно переместить в место где оплата происходит, после проверки факта оплаты. но last_sale_review все равно будет возвращать одинаковые товары

    сделайте запрос в phpmyadmin:
    Код (Text):
    1. select
    2. id, goods_id, name, price, images
    3. from last_sale
    4. group by goods_id
    5. order by id desc
    6. limit 4
    и сюда ошибку

    или можно попробывать еще вот так:
    вместо
    $ci->db->select("goods_id");
    >
    $ci->db->select("distinct(goods_id)");
    но я фиг знает, что этот конструктор запросов в итоге склеет за запрос. имхо все что сложнее "select * from table where id = 2" должно писаться в plain sql, а не через конструкторы, которые в каждом движке разные
     
    #6 storms89, 20 июл 2017
    Последнее редактирование: 20 июл 2017
  7. promo20122

    promo20122 Активный пользователь

    С нами с:
    18 июл 2017
    Сообщения:
    16
    Симпатии:
    0
    Дело в том, что оплата происходит на независимом сервисе Oplata.Info , по этому видимо и принял такое решение разработчик. После перехода на этот сервис, засчитывает как продажу.

    Написал вместо
    $ci->db->select("goods_id");
    >
    $ci->db->select("distinct(goods_id)");

    На сайте в выводе ошибки :)
    Жаль я не понимаю в функциях и пабликах PHP и JQuery, вряд ли смогу причину, а уж тем более вряд ли смогу переписать весь скрипт.

    Код (Text):
    1. A Database Error Occurred
    2. Error Number: 1064
    3.  
    4. 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
    5.  
    6. SELECT `id`, distinct(goods_id), `name`, `price`, `images` FROM (`last_sale`) ORDER BY `id` desc LIMIT 4
    7.  
    8. Filename: /home/last_sale_helper.php
    9.  
    10. Line Number: 17
    Сделал Ваш запрос в phpmyadmin, выдало пустую строку:
    Код (Text):
    1.  
    2. MySQL вернула пустой результат (т.е. ноль строк). (Запрос занял 0.0009 сек.)
    3. selectid,goods_id,name,price,imagesfromlast_salegroupbygoods_idorderbyiddesclimit4
     
    #7 promo20122, 20 июл 2017
    Последнее редактирование: 20 июл 2017
  8. storms89

    storms89 Активный пользователь

    С нами с:
    20 июн 2016
    Сообщения:
    59
    Симпатии:
    10
    да distinct первым должен идти, если не получится пишите)
    типо так:
    SELECT distinct(goods_id), `id`, `name`, .....
    а не так:
    SELECT some1, some2, ....someN...distinct(goods_id)
     
  9. promo20122

    promo20122 Активный пользователь

    С нами с:
    18 июл 2017
    Сообщения:
    16
    Симпатии:
    0
    Извините, я не понял вообще что Вы попросили сделать :)
    Я пробовал:
    Код (Text):
    1.  
    2. if ( ! function_exists('last_sale_review')) {
    3.    function last_sale_review()
    4.    {
    5.      $ci=& get_instance();
    6.   $ci->load->database();
    7.    
    8.      $ci->db->select("id");
    9.      $ci->db->select("distinct(goods_id)");
    10.      $ci->db->select("name");
    11.      $ci->db->select("price");
    12.      $ci->db->select("images");
    13.      $ci->db->from("last_sale");
    14.      $ci->db->order_by("id", "desc");
    15.      $ci->db->limit(4);
    16.      $comments = $ci->db->get();
    17.      $comments = $comments->result();
    18.    
    19.      return $comments;
    20.    }
    21. }
    А как и куда писать SELECT distinct(goods_id), `id`, `name`, ..... я что то не понял :(
    Это в phpmyadmin? Как там добавить Distinct? )
    Я вижу что в ошибке у меня выбило строку о которой Вы говорите. Но как сменить местами? :)
    --- Добавлено ---
    А, вот сменил "поля" в phpmyadmin, но результат тот же. Повторяются результаты)
    [​IMG]
    --- Добавлено ---
    Попробовал в phpmyadmin перенести строки местами, на первое место GOODS_ID, а так же в конструкторе первым поставил Goods_id, ошибка пропала, но результат тот же, товар повторяемый выводится
    PHP:
    1. if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    2.  
    3. if ( ! function_exists('last_sale_review')) {
    4.     function last_sale_review()
    5.     {
    6.         $ci=& get_instance();
    7.         $ci->load->database();
    8.        
    9.         $ci->db->select("distinct(goods_id)");
    10.         $ci->db->select("id");
    11.         $ci->db->select("name");
    12.         $ci->db->select("price");
    13.         $ci->db->select("images");
    14.         $ci->db->from("last_sale");
    15.         $ci->db->order_by("id", "desc");
    16.         $ci->db->limit(4);
    17.         $comments = $ci->db->get();
    18.         $comments = $comments->result();
    19.        
    20.         return $comments;
    21.     }  
    22. }
    23.  
    24. if ( ! function_exists('last_sale')) {
    25.     function last_sale($name,$goods_id,$price,$images)
    26.     {
    27.         $ci=& get_instance();
    28.         $ci->load->database();
    29.  
    30.         $data = array(
    31.            
    32.             "goods_id" => "$goods_id",
    33.             "id" => "",
    34.             "name" => "$name",
    35.             "price" => "$price",
    36.             "images" => "$images"
    37.         );
    38.  
    39.  
    40.         $ci->db->insert('last_sale', $data);
    41.  
    42.     }  
    43. }
     
  10. storms89

    storms89 Активный пользователь

    С нами с:
    20 июн 2016
    Сообщения:
    59
    Симпатии:
    10
    да, я про конструктор в php (а в самой базе лучше вернуть все как было). если хотите скиньте доступ на фтп в личку, посмотрю (или скиньте дамп этой таблцицы и напишите что это за движок, codeignater вроде?)
     
    #10 storms89, 21 июл 2017
    Последнее редактирование: 21 июл 2017
  11. promo20122

    promo20122 Активный пользователь

    С нами с:
    18 июл 2017
    Сообщения:
    16
    Симпатии:
    0
    При всем уважении к Вам и Вашей помощи, я очень благодарен Вам, что Вы единственный пытаетесь мне помочь! Но сайт в рабочем состоянии, и доступ к нему максимально защищен :)
    Это так званый "говно-код" от ytstyle, они пишут скрипты с шаблонами который подключается к системе "Digiseller". Брал я его в открытом доступе года два назад, и спустя такое время уже давно все переработал под себя, в том числе естественно и дизайн. Но баг с продажами так и остался. Здесь либо нужно переписать скрипт полность, связать как-то с БД, что бы он видел когда наличие товара уменьшается, а значит товар продался. Либо же хотя бы просто сделать вывод только уникального значения.

    У меня сохранились файлы оригинал в исходном состоянии. Как раз есть именно модуль последних продаж. Прикрепляю .zip

    P.S. Обратите внимание на файл confirm_buying.php , забавный файл. Может проблема решается именно в нем? Так же в order.php упоминаются некие token переменный, который находятся в confirm_buying.php вроде бы. В общем Вам виднее что там и как :) Напутано все для меня :)
    --- Добавлено ---
    На всякий случай, вставлю функцию из confirm_buying.php сюда
    PHP:
    1. if ($_POST['token'] == $_SESSION['lastToken'])
    2.     {
    3.         header('Location: /');
    4.     }
    5.     else
    6.     {
    7.     $_SESSION['lastToken'] = $_POST['token'];{
    8.  
    9.     if($movie_info[0]->in_stock == "y"){
    10.         $this->load->helper('top10');
    11.         $this->load->helper('last_sale');
    12.         $top_id = ($_POST["id_goods"]);
    13.         $goods_id = $movie_info[0]->digiseller_id;
    14.         $name = $movie_info[0]->goods_title;
    15.         $price = $movie_info[0]->price;
    16.         $images = $movie_info[0]->thumbnail;
    17.         top10_review($top_id);
    18.         last_sale($name,$goods_id,$price,$images);
    19.    
    20.         $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"]).'';
    21.        
    22.         header('Location: '.$redirect.'');
    23.     }else{
    24.         header('Location: /');
    25.     };
    26.  
    27.     }}
     

    Вложения:

  12. storms89

    storms89 Активный пользователь

    С нами с:
    20 июн 2016
    Сообщения:
    59
    Симпатии:
    10
    Код (Text):
    1.  
    2. select
    3. lt1.*
    4. from last_sale as lt1
    5. inner join (select goods_id, max(id) id from last_sale group by goods_id) as lt2
    6. on lt1.id = lt2.id and lt1.goods_id = lt2.goods_id
    7. order by lt1.id desc
    8. limit 3
    вот так попробуйте в phpmyadmin (если эт то что нужно, пришлю как это в пхп встаивть)
    по поводу confirm_buying. там идет редирект на сервис оплаты. нормальные платежные системы позволяют передать success и fail url, чтобы оповестить сайт о факте оплаты (удачной или не удачной), а там я вижу только fail url (и на сайте oplata.info не нашел вообще никакой документации)
     
    #12 storms89, 21 июл 2017
    Последнее редактирование: 21 июл 2017
  13. promo20122

    promo20122 Активный пользователь

    С нами с:
    18 июл 2017
    Сообщения:
    16
    Симпатии:
    0
    В phpmyadmin я наживаю вкладку SQL, верно? )
    Ответ:
    Код (Text):
    1. MySQL вернула пустой результат (т.е. ноль строк). (Запрос занял 0.0027 сек.)
    2. 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
     
  14. storms89

    storms89 Активный пользователь

    С нами с:
    20 июн 2016
    Сообщения:
    59
    Симпатии:
    10
    нет, что то не то.
    я заполнил, вашу таблицу у себя фейковыми записями:
    Код (Text):
    1. -- Adminer 4.2.5 MySQL dump
    2.  
    3. SET NAMES utf8;
    4. SET time_zone = '+00:00';
    5. SET foreign_key_checks = 0;
    6. SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
    7.  
    8. DROP TABLE IF EXISTS `last_sale`;
    9. CREATE TABLE `last_sale` (
    10.   `id` int(11) NOT NULL AUTO_INCREMENT,
    11.   `goods_id` int(11) NOT NULL,
    12.   `name` varchar(255) NOT NULL,
    13.   `price` int(11) NOT NULL,
    14.   `images` text NOT NULL,
    15.   PRIMARY KEY (`id`)
    16. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    17.  
    18. INSERT INTO `last_sale` (`id`, `goods_id`, `name`, `price`, `images`) VALUES
    19. (1,    1,    'товар 1',    111,    'картинка товара 1'),
    20. (2,    2,    'товар 2',    222,    'картинка товара 2'),
    21. (3,    1,    'товар 1',    111,    'картинка товара 1'),
    22. (4,    2,    'товар 2',    222,    'картинка товара 2'),
    23. (5,    2,    'товар 2',    222,    'картинка товара 2'),
    24. (6,    2,    'товар 2',    222,    'картинка товара 2'),
    25. (7,    2,    'товар 2',    222,    'картинка товара 2'),
    26. (8,    2,    'товар 2',    222,    'картинка товара 2'),
    27. (9,    2,    'товар 2',    222,    'картинка товара 2'),
    28. (10,    3,    'товар 3',    333,    'картинка товара 3');
    29.  
    30. -- 2017-07-21 12:45:08
    и когда я делаю запрос(что прислал вам) результат у меня такой:
    Код (Text):
    1. id    goods_id    name    price    images
    2. 10    3    товар 3    333    картинка товара 3
    3. 9    2    товар 2    222    картинка товара 2
    4. 3    1    товар 1    111    картинка товара 1
    а у вас почему то пусто... какая версия mysql у вас?(
    select version();
    )
     
  15. promo20122

    promo20122 Активный пользователь

    С нами с:
    18 июл 2017
    Сообщения:
    16
    Симпатии:
    0
    Блин, на Вашем примере круто получилось, то что нужно. А у меня почему то пустая строка, хм.
    phpMyAdmin Информация о версии:4.6.6
    По запросу:
    Код (Text):
    1.  Отображение строк 0 - 0 (1 всего, Запрос занял 0.0002 сек.)
    2. select version()
    3.  
    4. + Параметры
    5. version()
    6. 10.0.31-MariaDB-cll-lve
     
  16. storms89

    storms89 Активный пользователь

    С нами с:
    20 июн 2016
    Сообщения:
    59
    Симпатии:
    10
    предчувствую что дело в том что у вас не mysql :D
    --- Добавлено ---
    у меня была где-то mariadb установлена дома, приду попробую
     
  17. promo20122

    promo20122 Активный пользователь

    С нами с:
    18 июл 2017
    Сообщения:
    16
    Симпатии:
    0
    Ааааа! Дак у меня база данных пустая! Я не понимаю как так. Давно еще замечал. Там лишь разметка таблиц. А товары там не хранятся.
    [​IMG]
     
  18. storms89

    storms89 Активный пользователь

    С нами с:
    20 июн 2016
    Сообщения:
    59
    Симпатии:
    10
    это у вас вкладка структура, а данные во кладке обзор(ну и она не может быть пустой, если у вас одинаковые товары выводятся, была бы пустая, вообще ничего не выводилось бы ))
     
  19. promo20122

    promo20122 Активный пользователь

    С нами с:
    18 июл 2017
    Сообщения:
    16
    Симпатии:
    0
    Ой, товары хранятся в Items! Но там всего лишь пару штук их, шли как образцы во время установки БД. А с сайтом они не обновляются. Там те товары, которые удалены у меня на сайте. А так же новых нет, которых очень много! По этому, даже если мы и сделаем этот скрипт, я не знаю, будет ли он отображать новые товар! Здесь вообще криворукий создавал кто-то :D
    --- Добавлено ---
    Вот, понимаете? 19 штук! У меня на сайте около 300 товаров вообще-то :D Я не знаю, с чем это связано. Эта проблема была еще когда я даже ничего не изменял на сайте под себя. Она изначально не добавляла товары в БД. На хосте вроде как держит данные
    [​IMG]
     
  20. storms89

    storms89 Активный пользователь

    С нами с:
    20 июн 2016
    Сообщения:
    59
    Симпатии:
    10
    ну вот конкретно в функции вывода последних покупок которую мы ковыряем, эта таблица и не задействуется. а где-то еще да.... это может быть проблемой
     
  21. promo20122

    promo20122 Активный пользователь

    С нами с:
    18 июл 2017
    Сообщения:
    16
    Симпатии:
    0
    [​IMG]
    --- Добавлено ---
    Аа, понятно. Ну ладно, жду от Вас спасения ;) :D
     
  22. storms89

    storms89 Активный пользователь

    С нами с:
    20 июн 2016
    Сообщения:
    59
    Симпатии:
    10
    10.1.19-MariaDB должно работать.
    select * from last_sale order by id desc limit 10 покажите вывод
     
  23. promo20122

    promo20122 Активный пользователь

    С нами с:
    18 июл 2017
    Сообщения:
    16
    Симпатии:
    0
    Результат с запроса? Или всетаки вывод?
    Бросаю и то и то :)
    Код (Text):
    1. MySQL вернула пустой результат (т.е. ноль строк). (Запрос занял 0.0006 сек.)
    2. select * from last_sale order by id desc limit 10
    Вывод на странице home.php:
    PHP:
    1. <div class="main">
    2.                     <?php $this->load->helper('last_sale'); if(count(last_sale_review())) : foreach(last_sale_review() as $top): ?>
    3.     <?php $img_prop=array( 'src'=> '/uploads/' . $top->images, 'width' => 155, 'height' => 72, 'alt' => htmlspecialchars($top->name)); ?>
    4.     <a href="<?php echo '/goods/'.$top->goods_id; ?>">
    5.                 <div class="view view-eighth">
    6.                    <?php echo img($img_prop); ?>
    7.                    <div class="price-lastsale">
    8.             <?php echo $top->price; ?>&nbsp;<i class="fa fa-rub" aria-hidden="true"></i></div>
    9.                     <div class="mask">
    10.                         <h2><?php echo $top->name; ?></h2>
    11.                      </div>
    12.                 </div>
    13.     </a>
    14.     <div class="clear"></div>
    15.     <?php endforeach; endif; ?>
    16. </div>
     
  24. storms89

    storms89 Активный пользователь

    С нами с:
    20 июн 2016
    Сообщения:
    59
    Симпатии:
    10
    вы вводите меня в заблуждение ))
    этого БЫТЬ НЕ МОЖЕТ !) - MySQL вернула пустой результат (т.е. ноль строк). (Запрос занял 0.0006 сек.)
    вероятно база в которую вы делаете запрос через phpmyadmin отличается о той с которой работает ваш сайт. может вы загрузили сайт к себе локально, там проводите тесты, но недоконца загрузили базу?))
    --- Добавлено ---
    я имею ввиду что если у вас что-то выводится в этом блоке:
    Код (Text):
    1. <div class="main">
    2.                     <?php $this->load->helper('last_sale'); if(count(last_sale_review()))
    3. .....
    4. </div>
    то этого -
    не может быть
     
  25. promo20122

    promo20122 Активный пользователь

    С нами с:
    18 июл 2017
    Сообщения:
    16
    Симпатии:
    0
    Ёлеки палки! Я просто арендую два хоста, на одном провожу тесты и всякие разработки. А на втором стоит рабочий сайт. И оказывается на рабочем сайте, указана БД с тестового хоста. Дико прошу прощения! Но и спасибо, а то и не нашел бы ошибку эту :)
    Там вся БД забита товарами которые есть на сайте. И результаты теперь отображаются все.


    Вы просили сделать запрос:
    Код (Text):
    1. select * from last_sale order by id desc limit 10
    Сделал, ответ верный там, 10 последних товаров, которые повтоярются.
    [​IMG]


    До этого Вы просили сделать:
    Код (Text):
    1. select
    2. lt1.*
    3. from last_sale as lt1
    4. inner join (select goods_id, max(id) id from last_sale group by goods_id) as lt2
    5. on lt1.id = lt2.id and lt1.goods_id = lt2.goods_id
    6. order by lt1.id desc
    7. limit 3
    но я лимит увеличил до 10, и УРА, сработало! На скрине видно, что повторяющихся элементов нет.
    [​IMG]

    Выходит остается лишь Вам сказать как мне сделать в PHP этот запрос!