За последние 24 часа нас посетили 59095 программистов и 1771 робот. Сейчас ищут 1023 программиста ...

Запретить перезапись сессии в php

Тема в разделе "PHP для новичков", создана пользователем smartCreate, 9 ноя 2016.

  1. hust0

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

    С нами с:
    6 июл 2013
    Сообщения:
    321
    Симпатии:
    8
    можно, UPDATE имя таблицы SET number = number+1
     
  2. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4

    PHP:
    1. if (isset($_POST['btn_name'])) {
    2.     mysql> UPDATE nameTable SET number = number+1;
    3. }
    Взгляните пожалуйста, правильный синтаксис или где-то ошибся?
     
  3. hust0

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

    С нами с:
    6 июл 2013
    Сообщения:
    321
    Симпатии:
    8
    вот так должно
    PHP:
    1. if (isset($_POST['btn_name'])) {
    2.  
    3. $r=mysql_query("update `nameTable` set `number`=number+1");
    4.  
    5. }
     
  4. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Спасибо за помощь, попрошу Вас взглянуть на то что у меня получилось общими усилиями, так сказать проверить на изящность)


    PHP:
    1. $getNameArticul=mysql_query("select articul from $getName");
    2. $getNumberArticul=mysql_fetch_array($getNameArticul);
    3.          
    4. if ($getNumberArticul["articul"] == $tabel_name['articul']) AND (isset($_POST['btn_name'])){
    5.         mysql_query("update $getName set `number`=number+1");
    6.         }else{
    7.              //другое действие
    8.         }

    И если есть возможность, подскажите пожалуйста как можно туда всунуть еще одно условие:

    1) обновлять поле number только в той строчке таблицы которая содержит то самое значение 'articul' ($getNumberArticul["articul"] == $tabel_name['articul']);

    То есть логика этого скрипта такая - "если в таблице с именем $getName, уже содержится поле 'articul', значение одной из строчек которого = $tabel_name['articul'], то необходимо обновить значение которое содержится в поле 'number', в той же строчке"

    А сейчас у меня получается что обновляются все поля `number`(

    Я вот уже пол дня пытаюсь сам с этим разобраться, но либо нечего не выходит либо сплошные костыли состоящие из функций в 15 строчек + js функции на клиенте...
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    то, что ты решил хранить что-то одинаковое в разных таблицах - скорее всего плохо и не от большого опыта. Зачем ты это делаешь?
     
  6. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    это не что-то одинаковое в разных таблицах, таблица всего одна, в ней есть поля 'articul' и 'number', в эту таблицу добавляются товары. У каждого товара есть свой уникальный номер - артикул, который заноситься в поле 'articul', а в поле 'number' храниться количество. Когда добавляться новый товар в поле 'number' значение по умолчанию = 1. То что я описал выше мне нужно для того что бы не хранить
    - в моем случае как Вы уже поняли таблица одна просто полей много, так вот мне нужно что бы в этой таблицы не было много полей с одинаковыми товарами - я хочу реализовать это таким образом что бы при добавлении товара, проверялось существует ли уже поле 'articul' с таким же значением которое сейчас заноситься в таблицу и если да - то не добавлять туда весь товар целиком а просто абдейтить поле `number`, добавляя к нему единицу (то есть + 1 товар).

    На счет не большого опыта Вы абсолютно правы, я уже писал в этой теме неоднократно что еще очень слабоват в пхп, но для меня, как показала практика, лучший способ научится это сделать то что я нарисовал в своей голове от "А" и до "Я", а потом научиться сделать это правильно. Сейчас я застрял прямо на последнем шаге, той самой "Я", и прошу помочь сдвинуться с мертвой точки, пусть это будет не совсем корректно с точки зрения "изящность" кода и алгоритмов, но мне нужно это доделать, и я прошу это принять:)
    "Правильностью" всей моей задумки я буду заниматься уже на следующем этапе

    Заранее благодарен!
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    так, давай сразу задам вопрос, а то по твоим словам не ясно. Ты различаешь понятия таблица, строка и поле?

    возможно ты застрял, потому что это тупик, потому, что ты не туда идёшь - вот в чём соль. Поэтому придётся вернутся чуток, и начать от печки.
     
  8. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    да, я понимаю разницу между этими понятиями. я вот только не знаю почему утром прицепился к слову "поле", - видимо еще не проснулся, я имел в виду - "столбец" (хотя быть может в отношении БД оба понятия буду верны, здесь на самом деле не уверен). Отвечу на Ваш вопрос развернуто - существует база данных, в ней может находиться различное множество таблиц, таблицы состоят из столбцов (например "id", "name", "articul" и т.д.) и строчек (в строчках собственно и храниться информация) - надеюсь в полной мере ответил на Ваш вопрос.


    я прошу прощения, но мы же не изотерике сейчас говори, верно?) В следствии уже 3-х дневных изучений данного вопроса я понимаю - сделать что о чем я говорил выше возможно, и Вы я уверен лучше меня это знаете - единственная проблема это то что я слабоват в синтаксисе пхп, и мне, все не как не удается написать грамотное условие. По этому я и обращаюсь за помощью и советом сюда.

    А если я пишу вещи которые просто не понятны для восприятия, пожалуйста так и скажите, я опишу все более развернуто, если понадобиться со скриншотами там всякими и сносками на них. Просто в моей голове все выглядит более чем понятно - вот в чем соль:)
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я просто не врубаюсь, почему у тебя в переменной есть некое значение толи столбца, толи таблицы. Можешь расписать структуру и то, что ты делаешь с данными?
     
    denis01 нравится это.
  10. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    php.jpg
    Доброе утро) Давайте на скрине посмотрим.

    Значит таблица. В таблице есть столбцы "id', "title", "cost", "articul", "number".
    В эту таблицу заносятся значения (инфо о товаре) при нажатии на копку.
    У любого товара может повторяться и цена, и даже название, а вот артикул всегда уникальный.

    Как видите на скрине, у меня 2 и 3 строчка абсолютно одинаковые, по сути дубликат, а я хочу сделать так что бы этих дубликатов не было. Хочу что бы при нажатии на копку, которая заносить инфо в таблицу, осуществлялась проверка: "Если в таблице уже есть строка, в которой значение "articul" = тому же значению "articul", которое кнопка сейчас пытается записать в таблицу", - выполнить функцию: "Не записывать текущее значение передаваемые кнопкой, как новую строчку, а просто увеличить значение "number" на +1 в той строчке где повторяется "articul" (имеется в виду то его значение, которое мы проверяли выше)"

    Я уже почти решил эту задачу, с помощью @hust0, вот таким путем:

    PHP:
    1. $getNameArticul=mysql_query("select articul from `имя таблицы`");
    2. $getNumberArticul=mysql_fetch_array($getNameArticul); // значение "articul" наличие которого проверяться в таблице
    3.        
    4. if ($getNumberArticul["articul"] == $tabel_name['articul'])){ // $tabel_name['articul'], здесь - значение "articul" которое заноситься при нажатии на копку и с которым сравнивается "articul" в таблице.
    5.         mysql_query("update `имя таблицы` set `number`=number+1");
    6. }
    Но здесь не хватает очень важной фишки - сейчас, при выполнении этого скрипта, увеличиваются "+1" все значения которые содержатся в столбце "number". А нужно что бы увеличивалось только одно, конкретно в той сроке где мы находим повторяющийся "articul"
     
  11. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Вы всё правильно называете, кроме строки. Строка это либо переменная типа String, либо данные записывающиеся в виде 'Это строка'. Применительно к таблице следует использовать понятие запись.

    Вот пример того, чего вы хотите. Измените его под ваши условия.
    Table1 имеет структуру : [​IMG]

    PHP:
    1. include("bd.php"); // тут подключение к базе данных
    2.  
    3. $art = 11; // Какой либо артикул в этой переменой
    4. $sql = "SELECT id from table1 where articul =".$art; //этим запросом ищем есть ли уже в таблице такой артикул
    5. $result = mysql_query($sql,$db);
    6. $myrow = mysql_fetch_array($result); // получаем запись после запроса. Она будет пустой, если такого артикула нет в таблице
    7. if (isset($myrow["id"])) {
    8. //запись не пуста, такой артикул есть, запросом ниже обновляем его, увеличив его значение на единицу
    9.     mysql_query("update table1 set number = number + 1 where articul = ".$art,$db);
    10. }
    11. else {
    12.     // запись пуста. Такого артикула нет, поэтому вставляем этот артикул, и в поле number ставим единицу
    13.     mysql_query("insert into table1 articul, number VALUES (".$art.",1)",$db);
    14. }
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    добавь на поле уникальный индекс.
    --- Добавлено ---
    ни в одном из этих случаев не нужно использовать какие-то переменные, а тем более сессию. Это раз.

    Два, подход "селект, потом если есть апдейт" - это плохой подход, потому что между этими событиями эта строка может быть удалена. И конфуз выйдет.
    Для таких случаев используется insert on duplicate key update, эссно в связке с уникальным индексом.

    Канэц.
     
    denis01 нравится это.
  13. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    @SpikePHP, Спасибо за помощь, я понял логику, но не совсем понял откуда переменная "$db", берется и зачем она вообще нужна?
    Могу предположить что она связанна с:
    PHP:
    1. include("bd.php");
    по скольку у меня база подключается в отдельном конфиге, сделал вывод что переменная "$db" мне не нужна, убрал её - результат оказался как и с предыдущем скриптом, вместо нужного значения в столбце "number", обновились все "number", во всей таблице. А если я оставляю "$db", то скрипт не работает
     
  14. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    @igordata, Я прошу прощения, не увидел ваш ответ. Теперь вот увидел, но не совсем понял, вернее даже не так, не уверен что Вы меня верно поняли. Вот в случаи с советом @SpikePHP, все понятно, я конечно еще не разобрался с вот этой мелочью "$db", но в целом все понятно, скрипт находит в таблице повторявшееся значение "articul" и если находит то апдейтит "number" учитывая, в какой именно строке был найден повтор столбца "articul" - и все бы хорошо, вот только уже битый час не могу понять причем тут "$db" и какую роль она отыгрывает, к стати если вдруг Вы можете открыть мне на это глаза, то я был бы крайне благодарен.
    А вот к чему тот добавление уникального индекса (вариант который Вы предложили), я не совсем понимаю.

    На счет использование переменных и сессий, это уже немного из другой оперы, не к тому скрипту который сейчас рассматриваться.
    И относительно "insert on duplicate key update" - спасибо, учту это обязательно
     
  15. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    С содержимым bd.php :

    PHP:
    1. $db = mysql_connect ("localhost","loginMySQL","passMySQL");
    2. mysql_select_db ("dataBaseName",$db);
    3.  
    4. $art = 1;
    5. $sql = "SELECT id from table1 where articul =".$art;
    6.  
    7. $result = mysql_query($sql,$db);
    8. $myrow = mysql_fetch_array($result);
    9. if (isset($myrow["id"])) {
    10.     mysql_query("update table1 set number = number + 1 where articul = ".$art,$db);
    11. }
    12. else {
    13.     mysql_query("insert into table1 articul, number VALUES (".$art.",1)",$db);
    14. }
     
    denis01 нравится это.
  16. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Понял, спасибо! Задам еще один глупый вопрос, я правда пока не понимаю - как мне быть если у меня подключение к базе происходит в другом файле, (скрипт который Вы написали будет находиться в контролере, а подключение происходит в конфиге (конфигурационном файле) и самое главное подключение происходит не через "mysql_connect" и "mysql_select_db" потому как я работаю на кодигнайтере, там подключение происходит средствами самого фрейворка и имеет вид:

    PHP:
    1. $active_group = 'default';
    2. $active_record = TRUE;
    3.  
    4. $db['default']['hostname'] = 'mysql.ru-marketroll.myjino.ru';
    5. $db['default']['username'] = '046440826_fantan';
    6. $db['default']['password'] = 'gTNBK;aRV4GV';
    7. $db['default']['database'] = 'ru-marketroll_fantan';
    8. $db['default']['dbdriver'] = 'mysql';
    9. $db['default']['dbprefix'] = '';
    10. $db['default']['pconnect'] = TRUE;
    11. $db['default']['db_debug'] = TRUE;
    12. $db['default']['cache_on'] = FALSE;
    13. $db['default']['cachedir'] = '';
    14. $db['default']['char_set'] = 'utf8';
    15. $db['default']['dbcollat'] = 'utf8_general_ci';
    16. $db['default']['swap_pre'] = '';
    17. $db['default']['autoinit'] = TRUE;
    18. $db['default']['stricton'] = FALSE;
     
  17. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    @smartCreate Вам нужно будет поменять пароли.
     
    denis01 нравится это.
  18. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    @SpikePHP, это уже становиться плохой традицией, но я опять не понял) При чем здесь пароли?
     
    fablee нравится это.
  19. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    зло не дремлет, оно пьет кофе с печеньками :)