PHP: if (isset($_POST['btn_name'])) { mysql> UPDATE nameTable SET number = number+1; } Взгляните пожалуйста, правильный синтаксис или где-то ошибся?
вот так должно PHP: if (isset($_POST['btn_name'])) { $r=mysql_query("update `nameTable` set `number`=number+1"); }
Спасибо за помощь, попрошу Вас взглянуть на то что у меня получилось общими усилиями, так сказать проверить на изящность) PHP: $getNameArticul=mysql_query("select articul from $getName"); $getNumberArticul=mysql_fetch_array($getNameArticul); if ($getNumberArticul["articul"] == $tabel_name['articul']) AND (isset($_POST['btn_name'])){ mysql_query("update $getName set `number`=number+1"); }else{ //другое действие } И если есть возможность, подскажите пожалуйста как можно туда всунуть еще одно условие: 1) обновлять поле number только в той строчке таблицы которая содержит то самое значение 'articul' ($getNumberArticul["articul"] == $tabel_name['articul']); То есть логика этого скрипта такая - "если в таблице с именем $getName, уже содержится поле 'articul', значение одной из строчек которого = $tabel_name['articul'], то необходимо обновить значение которое содержится в поле 'number', в той же строчке" А сейчас у меня получается что обновляются все поля `number`( Я вот уже пол дня пытаюсь сам с этим разобраться, но либо нечего не выходит либо сплошные костыли состоящие из функций в 15 строчек + js функции на клиенте...
то, что ты решил хранить что-то одинаковое в разных таблицах - скорее всего плохо и не от большого опыта. Зачем ты это делаешь?
это не что-то одинаковое в разных таблицах, таблица всего одна, в ней есть поля 'articul' и 'number', в эту таблицу добавляются товары. У каждого товара есть свой уникальный номер - артикул, который заноситься в поле 'articul', а в поле 'number' храниться количество. Когда добавляться новый товар в поле 'number' значение по умолчанию = 1. То что я описал выше мне нужно для того что бы не хранить - в моем случае как Вы уже поняли таблица одна просто полей много, так вот мне нужно что бы в этой таблицы не было много полей с одинаковыми товарами - я хочу реализовать это таким образом что бы при добавлении товара, проверялось существует ли уже поле 'articul' с таким же значением которое сейчас заноситься в таблицу и если да - то не добавлять туда весь товар целиком а просто абдейтить поле `number`, добавляя к нему единицу (то есть + 1 товар). На счет не большого опыта Вы абсолютно правы, я уже писал в этой теме неоднократно что еще очень слабоват в пхп, но для меня, как показала практика, лучший способ научится это сделать то что я нарисовал в своей голове от "А" и до "Я", а потом научиться сделать это правильно. Сейчас я застрял прямо на последнем шаге, той самой "Я", и прошу помочь сдвинуться с мертвой точки, пусть это будет не совсем корректно с точки зрения "изящность" кода и алгоритмов, но мне нужно это доделать, и я прошу это принять "Правильностью" всей моей задумки я буду заниматься уже на следующем этапе Заранее благодарен!
так, давай сразу задам вопрос, а то по твоим словам не ясно. Ты различаешь понятия таблица, строка и поле? возможно ты застрял, потому что это тупик, потому, что ты не туда идёшь - вот в чём соль. Поэтому придётся вернутся чуток, и начать от печки.
да, я понимаю разницу между этими понятиями. я вот только не знаю почему утром прицепился к слову "поле", - видимо еще не проснулся, я имел в виду - "столбец" (хотя быть может в отношении БД оба понятия буду верны, здесь на самом деле не уверен). Отвечу на Ваш вопрос развернуто - существует база данных, в ней может находиться различное множество таблиц, таблицы состоят из столбцов (например "id", "name", "articul" и т.д.) и строчек (в строчках собственно и храниться информация) - надеюсь в полной мере ответил на Ваш вопрос. я прошу прощения, но мы же не изотерике сейчас говори, верно?) В следствии уже 3-х дневных изучений данного вопроса я понимаю - сделать что о чем я говорил выше возможно, и Вы я уверен лучше меня это знаете - единственная проблема это то что я слабоват в синтаксисе пхп, и мне, все не как не удается написать грамотное условие. По этому я и обращаюсь за помощью и советом сюда. А если я пишу вещи которые просто не понятны для восприятия, пожалуйста так и скажите, я опишу все более развернуто, если понадобиться со скриншотами там всякими и сносками на них. Просто в моей голове все выглядит более чем понятно - вот в чем соль
я просто не врубаюсь, почему у тебя в переменной есть некое значение толи столбца, толи таблицы. Можешь расписать структуру и то, что ты делаешь с данными?
Доброе утро) Давайте на скрине посмотрим. Значит таблица. В таблице есть столбцы "id', "title", "cost", "articul", "number". В эту таблицу заносятся значения (инфо о товаре) при нажатии на копку. У любого товара может повторяться и цена, и даже название, а вот артикул всегда уникальный. Как видите на скрине, у меня 2 и 3 строчка абсолютно одинаковые, по сути дубликат, а я хочу сделать так что бы этих дубликатов не было. Хочу что бы при нажатии на копку, которая заносить инфо в таблицу, осуществлялась проверка: "Если в таблице уже есть строка, в которой значение "articul" = тому же значению "articul", которое кнопка сейчас пытается записать в таблицу", - выполнить функцию: "Не записывать текущее значение передаваемые кнопкой, как новую строчку, а просто увеличить значение "number" на +1 в той строчке где повторяется "articul" (имеется в виду то его значение, которое мы проверяли выше)" Я уже почти решил эту задачу, с помощью @hust0, вот таким путем: PHP: $getNameArticul=mysql_query("select articul from `имя таблицы`"); $getNumberArticul=mysql_fetch_array($getNameArticul); // значение "articul" наличие которого проверяться в таблице if ($getNumberArticul["articul"] == $tabel_name['articul'])){ // $tabel_name['articul'], здесь - значение "articul" которое заноситься при нажатии на копку и с которым сравнивается "articul" в таблице. mysql_query("update `имя таблицы` set `number`=number+1"); } Но здесь не хватает очень важной фишки - сейчас, при выполнении этого скрипта, увеличиваются "+1" все значения которые содержатся в столбце "number". А нужно что бы увеличивалось только одно, конкретно в той сроке где мы находим повторяющийся "articul"
Вы всё правильно называете, кроме строки. Строка это либо переменная типа String, либо данные записывающиеся в виде 'Это строка'. Применительно к таблице следует использовать понятие запись. Вот пример того, чего вы хотите. Измените его под ваши условия. Table1 имеет структуру : PHP: include("bd.php"); // тут подключение к базе данных $art = 11; // Какой либо артикул в этой переменой $sql = "SELECT id from table1 where articul =".$art; //этим запросом ищем есть ли уже в таблице такой артикул $result = mysql_query($sql,$db); $myrow = mysql_fetch_array($result); // получаем запись после запроса. Она будет пустой, если такого артикула нет в таблице if (isset($myrow["id"])) { //запись не пуста, такой артикул есть, запросом ниже обновляем его, увеличив его значение на единицу mysql_query("update table1 set number = number + 1 where articul = ".$art,$db); } else { // запись пуста. Такого артикула нет, поэтому вставляем этот артикул, и в поле number ставим единицу mysql_query("insert into table1 articul, number VALUES (".$art.",1)",$db); }
добавь на поле уникальный индекс. --- Добавлено --- ни в одном из этих случаев не нужно использовать какие-то переменные, а тем более сессию. Это раз. Два, подход "селект, потом если есть апдейт" - это плохой подход, потому что между этими событиями эта строка может быть удалена. И конфуз выйдет. Для таких случаев используется insert on duplicate key update, эссно в связке с уникальным индексом. Канэц.
@SpikePHP, Спасибо за помощь, я понял логику, но не совсем понял откуда переменная "$db", берется и зачем она вообще нужна? Могу предположить что она связанна с: PHP: include("bd.php"); по скольку у меня база подключается в отдельном конфиге, сделал вывод что переменная "$db" мне не нужна, убрал её - результат оказался как и с предыдущем скриптом, вместо нужного значения в столбце "number", обновились все "number", во всей таблице. А если я оставляю "$db", то скрипт не работает
@igordata, Я прошу прощения, не увидел ваш ответ. Теперь вот увидел, но не совсем понял, вернее даже не так, не уверен что Вы меня верно поняли. Вот в случаи с советом @SpikePHP, все понятно, я конечно еще не разобрался с вот этой мелочью "$db", но в целом все понятно, скрипт находит в таблице повторявшееся значение "articul" и если находит то апдейтит "number" учитывая, в какой именно строке был найден повтор столбца "articul" - и все бы хорошо, вот только уже битый час не могу понять причем тут "$db" и какую роль она отыгрывает, к стати если вдруг Вы можете открыть мне на это глаза, то я был бы крайне благодарен. А вот к чему тот добавление уникального индекса (вариант который Вы предложили), я не совсем понимаю. На счет использование переменных и сессий, это уже немного из другой оперы, не к тому скрипту который сейчас рассматриваться. И относительно "insert on duplicate key update" - спасибо, учту это обязательно
С содержимым bd.php : PHP: $db = mysql_connect ("localhost","loginMySQL","passMySQL"); mysql_select_db ("dataBaseName",$db); $art = 1; $sql = "SELECT id from table1 where articul =".$art; $result = mysql_query($sql,$db); $myrow = mysql_fetch_array($result); if (isset($myrow["id"])) { mysql_query("update table1 set number = number + 1 where articul = ".$art,$db); } else { mysql_query("insert into table1 articul, number VALUES (".$art.",1)",$db); }
Понял, спасибо! Задам еще один глупый вопрос, я правда пока не понимаю - как мне быть если у меня подключение к базе происходит в другом файле, (скрипт который Вы написали будет находиться в контролере, а подключение происходит в конфиге (конфигурационном файле) и самое главное подключение происходит не через "mysql_connect" и "mysql_select_db" потому как я работаю на кодигнайтере, там подключение происходит средствами самого фрейворка и имеет вид: PHP: $active_group = 'default'; $active_record = TRUE; $db['default']['hostname'] = 'mysql.ru-marketroll.myjino.ru'; $db['default']['username'] = '046440826_fantan'; $db['default']['password'] = 'gTNBK;aRV4GV'; $db['default']['database'] = 'ru-marketroll_fantan'; $db['default']['dbdriver'] = 'mysql'; $db['default']['dbprefix'] = ''; $db['default']['pconnect'] = TRUE; $db['default']['db_debug'] = TRUE; $db['default']['cache_on'] = FALSE; $db['default']['cachedir'] = ''; $db['default']['char_set'] = 'utf8'; $db['default']['dbcollat'] = 'utf8_general_ci'; $db['default']['swap_pre'] = ''; $db['default']['autoinit'] = TRUE; $db['default']['stricton'] = FALSE;