Ответы пользователя по тегу MySQL
  • Возможно ли выполнить несколько запросов к БД в одном mysqli_query?

    shaks
    @shaks
    буквально на днях уже подымался этот вопрос.
    php.net/manual/ru/mysqli.multi-query.php
    разделяйте строки через ; и используйте не mysqli_query а mysqli_multi_query

    PS. как вас только не тошнит пользоваться mysqli*
    Ответ написан
    Комментировать
  • PHP-скрипты выполняются последовательно?

    shaks
    @shaks
    Используйте транзакции баз данных. Они как раз для подобных случаев и созданы.
    Логика примерно следующая
    псевдокод:
    <транзакция>
    - удаляем что-то
    - апдейтим что-то гдето
    - записываем что-то кудато
    если всё ок:
         -- commit, все запросы в бд ушли, но не выполнились, команда commit выполняет их все сразу. 
    иначе
        -- rollback - откат всех запросов в бд, что выполнены в блоке транзакции. 
    </транзакция>
    Ответ написан
  • Кто поможет переписать SQL запрос?

    shaks
    @shaks
    Я не совсем понял что у вас где храниться, и зачем вам логин аккаунта, но подразумеваю что вы имели ввиду что баланс юзера хранится не в таблице users а в таблице lm_balance

    Эти таблицы объединяет только одно ИД аккаунта

    Во первых имя колонки с id аккаунта (ид юзера в вашем случае) должен называться user_id а не name (судя по вашему sql запросу).
    Во вторых, balance = balance +" . floor($_credits) . " - за это руки вырывать надо, с корнями.
    Баланс ведите в наименьшей величине, если баланс рублевый - в копейках, долларовый - в центах, биткоиновый - в сатоши, и тд, и ничего не округлять никогда, если хотите чтобы сводился дебит с кредитом. При работе с большими числами лучше использовать либу по работе с большими числами
    В третьих, ид юзера нужно просить не юзера ввести, а брать из сессии (если у вас сессионная авторизация).
    В четвертых, функции mysql_* уже давно устарели и помечены как деприкейтед. В пхп7, если я не ошибаюсь - драйвер mysql убрали.
    Ответ написан
    Комментировать
  • В каком случае запрос быстрее?

    shaks
    @shaks
    в мускуле можно глянуть с помощью профайлера. Он доступен помоему с 5й версии или типа того

    set profiling=1;
    SELECT * FROM `table` ORDER BY (`column1` - `column2`);
    SELECT *, (`column1` - `column2`) AS `column3` FROM `table` ORDER BY `column3`;
    show profiles;

    На выходе получишь табличку со скоростью выполнения каждого из запросов
    Ответ написан
    Комментировать
  • Запись в БД MySQL?

    shaks
    @shaks
    DevMan правильно написал. сначала надо собрать строку, а потом сделать за одни запрос в базу уже апдейт, т.е. так какбы логично и правильно.

    Если я правильно понял то вам нужна конкатенация строки (дозаписать):
    `column` = CONCAT(`column`,' addon string')

    Тут кусок кода, как собрать валидные мыла, и как их вставить через запятую в sql запрос твой.
    pastebin.com/rGdPqU51
    только вставку в mysql выведи за пределы твоего цикла foreach
    Ответ написан
    Комментировать
  • Как правильно составить mysql запрос для рейтинга?

    shaks
    @shaks
    ну просто отсортируй по рейтингу DESC, сгруппированно по org_id и с лимитом в 5.
    Ответ написан
    Комментировать
  • Почему выскакивает ошибка #1064 при выполнении SQL запроса INSERT INTO?

    shaks
    @shaks
    во первых запрос должен иметь примерно такой формат:
    INSERT INTO `price` (`N`, `title`, `localsum`, `regionsum`, `rfsum`, `intersum`) VALUES  (1,'Poi',2,1000,1500,2000,4000)

    обрати внимание, что кол-во полей не то, кол-во данных которые вставляются не соответствует кол-ву полей
    во вторых у вас тип данных не правильный

    `localsum` char(100) not null,
    `regionsum` char(100) not null,
    `rfsum` char(100) not null,
    `intersum` char(100) not null,

    эти поля должны быть int а не char
    Если вы хотите именно строку, то цифры (при вставке) нужно оборачивать в кавычки

    в третьих, раз `N` int not null auto_increment, то значение N можно или игнорировать при вставке, или передавать NULL

    P.S. Строку вставки можно делать так:
    INSERT INTO `price` SET `field`=1, `field2`=2, `field3`=3

    так визуально понятней что куда вставляется

    ------
    UPD
    <?php
    // соединение с базой:
    chdir(dirname(__FILE__));
    $dsn = 'mysql:host=localhost'.
        ';dbname=temp_development'.
        ';port='.
        ';connect_timeout=15';
    
    $user = 'root';
    $password = '123qwe#';
    $db = new PDO($dsn, $user, $password);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    
    
    $file = "./price.txt";# 'Poi',2,1000,1500,2000
    # в файле я убрал последнее значение, т.к. для него нет соответствующей колонки в ДБ
    if($fp = fopen($file, 'r'))
    {
        $sql = "INSERT INTO `price` (`title`, `localsum`, `regionsum`, `rfsum`, `intersum`) VALUES ";
        $prepare = array();
        $insert = array();
        while($line = fgets($fp))
        {
            $line = trim($line);
            if(!$line)
                continue;
            # Читаю файл построчно, чтоб память не загадилась если файл содержит оч много данных
    
            // валидацию данных я не делаю
            array_push($prepare, implode(",", array_fill(0, 5, "?")));
            $insert = array_merge($insert, explode(",", $line));
    
        }
        $pr = $db->prepare($sql."( ".implode("), (", $prepare)." )");
        $pr->execute($insert);
    }

    этот код сгенерирует такой вот запрос в бд:
    INSERT INTO `price` (`title`, `localsum`, `regionsum`, `rfsum`, `intersum`) VALUES ( '\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000'), ('\'Poi\'','2','1000','1500','2000' )
    Ответ написан
    3 комментария
  • Как сделать подмену запросов?

    shaks
    @shaks
    все просто. поиск должен выполнять один роут (в вашем случае файл) со всеми возможными фильтрами поиска.
    Ответ написан
    Комментировать
  • Как сделать автоподстановку значения поля SQL при пустой строке?

    shaks
    @shaks
    Необходимо же сделать так, чтобы при незаполненном поле формы в соответствующую ячейку БД записывалось дефолтное значение таблицы.


    www.mysql.ru/docs/man/ALTER_TABLE.html
    ALTER [IGNORE] TABLE tbl_name  [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

    В твоем случае будет чтото типа такого:
    ALTER  TABLE `tbl_name`  CHANGE  `changelog`  `changelog` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT 'changelog.txt'
    # @ phpmyadmin
    Ответ написан
  • Вывод столбца mysql с определенным значением?

    shaks
    @shaks
    SELECT COUNT(*) as 'count' FROM `users` WHERE `status` = 0


    PS. Ваш код гавно. Смотри в сторону ORM или PDO
    Ответ написан
    Комментировать
  • Как извлечь из MySQL данные по нескольким критериям силами PHP?

    shaks
    @shaks
    Я не побоюсь выразить наверное то, что крутится у многих на языке, кто прочел это) - Это пиздец, дружище ) Большой, кромешный пиздец )
    Выход из ситуации. - nosql. Забудь про Мускул. Сделай все на mongodb например. Все данные хранить в древовидных коллекциях. Вобщем почитай, как раз все твои проблемы решаться оч легко и изящно.

    NoSql позволит тебе в одной коллекции (аля таблице) хранить как автомобили с их характеристиками, так и туалетную бумагу, домашних животных и разные сорта вятского кваса.

    Upd А по сабжу, если уж на мускуле делать, то нужно делать через связи has_many и/или has_and_belongs_to_many/has_many through, а не лепить айди через запятую и искать регулярками.

    Т.е. есть таблица товаров. Есть таблица фильтров, и есть соединяющая таблица товаров и фильтров.
    У каждого товара есть id, у каждого фильтра есть id, а в соединяющей таблице пишутся id'ы товаров и фильтров. Таким образом ты получишь нужную тебе связь.
    Если ты чувствуешь что делаешь чтото не так, то скорей всего так оно и есть :) С таким подходом как у тебя, теряется вся логическая цепочка, мускул сойдет с ума, ибо не будет ведать что он творит )
    Ответ написан
    4 комментария
  • Где и как держать большую базу данных?

    shaks
    @shaks
    Загляни в mysql-slow.log, посмотри на тяжелые запросы, подшамань да подкрути их. там 146% есть гайки которые можно подкрутить.
    Пологируй все запросы чуток. Проанализируй каждый из них на ПРАВИЛЬНОЕ использование индексов. Поубирай лишние индексы (освободишь наверное процентов 20-30 пространства). Вобщем оптимизируй. И только если оптимизировать нечего - тогда уже стоит задумываться о шардах.
    Ответ написан
    4 комментария
  • Error 1064 (DB1) ,что это значит?

    shaks
    @shaks
    В следующий раз выкладывай сам sql запрос который уходит в мускул. А по сабжу, написано же четко и ясно - косяк в синтаксисе, - иди кури мануалы (так и написано примерно).
    ОШИБКИ НАДО ЧИТАТЬ. Первое правило программиста ;)
    Ответ написан
    Комментировать
  • PHP / MySQL (VDS CentOS) - Как подключиться к удаленному серверу?

    shaks
    @shaks
    ОШИБКИ НАДО ЧИТАТЬ!
    > Но при подключении выдает довольно таки странную ошибку:
    Access denied for user 'someuser'@'23.252.*.*'
    В чем странность, доступ запрещен для юзера такого-то с такого-то IP. Если логин/пасс верные, то логично предположить что проблема в IP. Значит на стороне сервера, к которому вы хотите подключиться, нужно разрешить обращения с вашего IP.
    Как это сделать уже другой вопрос, дам наводку - dev.mysql.com/doc/refman/5.0/en/server-options.htm...
    Ответ написан
    Комментировать
  • Проблема с разработкой доски объявлений

    shaks
    @shaks
    Советую глянуть в сторону NoSQL решений, например MongoDB.
    А по поводу mysql щас подумаю, чуть позже отпишу.

    ** подумал..
    4 таблицы:
    items - товары
    categories - список категорий (под-категории не учитываю для простоты изъяснения)
    options - характеристики товаров (связь один ко многим)
    items_categories - категории товаров (связь один ко многим)

    Суть вот в чем, у каждого товара может быть ноль или много характеристик. Характеристики имеют ключ и значение, значение может быть типа integer или varchar. В этом заключается проблема, не знаю как её можно решить изящно. Как вариант делать два поля string_value и int_value с соответствующим типом. А при поиске выбирать поле по типу искомого.

    items_categories содержит в себе поля category_id и item_id, таким образом список категорий того или иного товара достигается элементарным запросом с inner join

    Пример выборки категорий товара
    SELECT `categories`.* FROM `categories` INNER JOIN `items_categories` ON `categories`.`id` = `items_categories`.`category_id` WHERE `items_categories`.`item_id` = 123


    Пример выборки товара с его характеристиками
    SELECT `items`.* , `options`.* FROM `items`, `options` WHERE `items`.`id` = 123 AND `options`.`item_id` = `items`.`id`


    В общем как-то так..
    Ответ написан