[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Пишем скрипт каталога на БД
freed-master
Есть замысел, причем очень срочный, написать скрипт каталога с такими возможностями:
- хранение инфо о товарах (наименование, артикул, описание, производитель, картинку);
- возможность менять цены товаров через веб-интерфейс (используя формы);
- поиск товаров;

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

Поехали...

Первым делом нужно создать БД, допустим wares. Для этого использую утилиту phpmyadmin и сразу возникает вопрос какое выбрать сравнение и что это вообще такое?

Делом вторым нужны таблицы, и тут вообще "глухарь"
во-первых: сколько таблиц? - допустим одну таблицу с 5 полями (поправте если что не так) для хранения всей инфы о всех товарах с названием info

во-вторых: нужно эти поля как-то определить, настроить - не знаю как это называется; вобщем в phpmyadmin есть следующие опции:

1) Поле - ? (название по которому будут делаться запросы к этому полю?)
2) Тип - ну тут вроде ясно: текстовый числовой и т.п.
3) Длины/Значения - ? (для чего это?)
4) Сравнение - ? (ведь мы ранее определили сравнение для всей таблицы, зачем это делать для каждого поля?)
5) Атрибуты - ? (что это?)
6) Ноль - ? (первоначальное значение?)
7) По умолчанию - ? (что по умолчанию?)
8) Дополнительно - ? (наверно это не обязательно?)
9) Первичный / Индекс / Уникальное / --- - ? (Что выбрать, и зачем?)
10) Комментарии - ? (Коменты создателя на будущее, что б не запутаться или как?)
11) MIME-тип - ? (здесь наварное нужно что-то выбрать для поля с картинкой?)
12) Трансформация браузера - ? (Что и для чего это?)
13) Опции трансформации - ? (какие?)

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



Спустя 3 минуты, 29 секунд (26.02.2009 - 20:06) sspy написал(а):
Если срочно то труба тебе)) задолбаешься))) Тут php+mysql надо учить

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

Спустя 4 минуты, 29 секунд (26.02.2009 - 20:10) Guest написал(а):
Вот почитай, там про гстевую но разжвана до мелочей если все прочитаешь думаю сам сможешь каталог написать. Мануал

Спустя 24 секунды (26.02.2009 - 20:11) sspy написал(а):
Вот почитай, там про гстевую но разжвана до мелочей если все прочитаешь думаю сам сможешь каталог написать. Мануал

Спустя 4 минуты, 37 секунд (26.02.2009 - 20:15) sergeiss написал(а):
Если срочно, то это в раздел "Предлагаю работу". Иначе - изучать мануал и делать не торопясь.

Спустя 36 минут, 2 секунды (26.02.2009 - 20:51) freed-master написал(а):
Ладно, я вас понял, но отступать не собираюсь. А по сему буду разбираться, выкладывать постепенно растущий код, и прошу вас подправлять если что не так.

Спустя 3 часа, 53 минуты, 16 секунд (27.02.2009 - 00:45) freed-master написал(а):
1. Создал БД wares со сравнением utf8_general_ci

2. Создал нового пользователя со всеми привелегиями

3. Создал таблицу wares_posts c 5 полями:
Код
   Поле         Тип данных
1) code         VARCHAR(12)    primary key          
2) ware         TEXT
3) description  TEXT
4) producer     TEXT
5) price        DOUBLE


4. Создал файл .htaccess с текстом:
Код
AddDefaultCharset UTF-8


5. Создал файл config.php с кодом:
Код
<?PHP
define("MYSQL_SERVER", "localhost");
define("MYSQL_DATABASE", "wares");
define("MYSQL_USER", "login");
define("MYSQL_PASSWORD", "parole");

define("PREFIX","wares_");

$sql = @mysql_connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD);
if(!$sql)
   exit("Сервер MYSQL не доступен, отображение страницы невозможно.");
   
$db = @mysql_select_db (MYSQL_DATABASE);
if(!$db)
   exit("База данных не доступна, отображение страницы невозможно.");
   
@mysql_query("SET NAMES utf8");
?>


6. Создал файл index.php с кодом:
Код
<?php
header("Content-Type: text/html; charset=utf-8");
# Подключим наш конфигурационный файл.
include_once("config.php");

$code = isset($_POST['code'])?$_POST['code']:null;
$ware = isset($_POST['ware'])?$_POST['ware']:null;
$description = isset($_POST['description'])?$_POST['description']:null;
$producer = isset($_POST['producer'])?$_POST['producer']:null;
$price = isset($_POST['price'])?$_POST['price']:null;

if(isset($_POST['ok']))  
{  
 
mysql_query("INSERT INTO `".PREFIX."posts` SET `code`='".$code."', `ware`='".$ware."', `description`='".$description."', `producer`='".$producer."', `price`='".$price."' ", $sql) or die ("Ошибка запроса №1 : " . mysql_error());

header("location: ".$_SERVER['PHP_SELF']."?a=".rand(100,1));
}  
else  
{  
echo "Напишите что нибудь";  
}
?>  
<form action="?" method="post">
Артикул:
<input name="code" type="text"  value="<?php echo htmlspecialchars($code) ?>"/><br />
Наименование:
<input name="ware" type="text"  value="<?php echo htmlspecialchars($ware) ?>"/><br />
Описание:
<textarea name="description" cols="40" rows="10">
<?php echo htmlspecialchars($description); ?>
</textarea><br />
Производитель:
<input name="producer" type="text"  value="<?php echo htmlspecialchars($producer) ?>"/><br />
Цена:
<input name="price" type="text"  value="<?php echo htmlspecialchars($price) ?>"/><br />
<input name="ok" type="submit" />  
</form>

<?php  
$result = mysql_query("SELECT * FROM `".PREFIX."posts` ") or die ("Ошибка запроса №2 : " . mysql_error());

while($row = mysql_fetch_assoc($result))
{
echo htmlspecialchars($row["code"]);
echo "<br>";
echo htmlspecialchars($row["ware"]);
echo "<br>";
echo htmlspecialchars($row["description"]);
echo "<br>";
echo htmlspecialchars($row["producer"]);
echo "<br>";  
echo htmlspecialchars($row["price"]);
echo "<br><br>";
}
?>

Вроде все работает, но выводится на страницу только первая запись таблицы. Очевидно нужно чтото добавить в скобку после нолика:
Код
echo mysql_result($result,0);

Но что?

Спустя 58 минут, 57 секунд (27.02.2009 - 01:44) twin написал(а):
Нет, функция mysql_result() выводит результат запроса по указанным параметрам, а именно $result - указатель запроса, 0 - ряд, "code" - поле.
Если нужны все записи, то как минимум в цикле нужно менять второй аргумент - ряд. Но это не рациональное решение, так как функция mysql_result() удобна только при одиночном значении. Лучше получить результат запроса массивом, функцией mysql_fetch_assoc() и разобрать массив циклом while

PHP
<?
while(
$row mysql_fetch_assoc($result))
{
echo 
htmlspecialchars($row["code"]);
echo 
"<br>";
# И т.д. и т.п. и пр. пр.

Спустя 16 часов, 12 минут, 31 секунда (27.02.2009 - 17:56) freed-master написал(а):
То что нужно!
Теперь пытаюсь сделать так чтоб после подачи запроса поля формы делались пустыми. Предложили вариант - формировать новую страницу, но что-то не получается, вот код файла index.php:
Код
<?php
header("Content-Type: text/html; charset=utf-8");
# Подключим наш конфигурационный файл.
include_once("config.php");

$code = isset($_POST['code'])?$_POST['code']:null;
$ware = isset($_POST['ware'])?$_POST['ware']:null;
$description = isset($_POST['description'])?$_POST['description']:null;
$producer = isset($_POST['producer'])?$_POST['producer']:null;
$price = isset($_POST['price'])?$_POST['price']:null;

if(isset($_POST['ok']))  
{  
# А вот и наш запрос.      
mysql_query("INSERT INTO `".PREFIX."posts` SET `code`='".$code."', `ware`='".$ware."', `description`='".$description."', `producer`='".$producer."', `price`='".$price."' ", $sql) or die ("Ошибка запроса №1 : " . mysql_error());

header("location: ".$_SERVER['PHP_SELF']."?a=".rand(100,1));
}  
else  
{  
echo "Напишите что нибудь";  
}
?>  
<form action="?" method="post">
Артикул:
<input name="code" type="text"  value="<?php echo htmlspecialchars($code) ?>"/><br />
Наименование:
<input name="ware" type="text"  value="<?php echo htmlspecialchars($ware) ?>"/><br />
Описание:
<textarea name="description" cols="40" rows="10">
<?php echo htmlspecialchars($description); ?>
</textarea><br />
Производитель:
<input name="producer" type="text"  value="<?php echo htmlspecialchars($producer) ?>"/><br />
Цена:
<input name="price" type="text"  value="<?php echo htmlspecialchars($price) ?>"/><br />
<input name="ok" type="submit" />  
</form>

<?php  
$result = mysql_query("SELECT * FROM `".PREFIX."posts` ") or die ("Ошибка запроса №2 : " . mysql_error());

while($row = mysql_fetch_assoc($result))
{
echo htmlspecialchars($row["code"]);
echo "<br>";
echo htmlspecialchars($row["ware"]);
echo "<br>";
echo htmlspecialchars($row["description"]);
echo "<br>";
echo htmlspecialchars($row["producer"]);
echo "<br>";  
echo htmlspecialchars($row["price"]);
echo "<br><br>";
}
?>

Выдает:
Код
Warning: Cannot modify header information - headers already sent by...

Спустя 50 минут, 46 секунд (27.02.2009 - 18:47) twin написал(а):
Цитата
По этому до открывающего тега <php ?> Не должно быть не только вывода (html тегов), но и даже пробелов.

Спустя 1 минута, 45 секунд (27.02.2009 - 18:49) freed-master написал(а):
Так ведь и нет ничего!

Спустя 7 минут, 3 секунды (27.02.2009 - 18:56) twin написал(а):
На нет и суда нет, сказал судья, получивший взятку после ответа подсудимого на вопрос "Считаете ли Вы себя виновным?"

Вот в этом файле посмотри
include_once("config.php");

Спустя 6 минут, 48 секунд (27.02.2009 - 19:02) freed-master написал(а):
И там все в порядке. Может есть др. способ?

Спустя 9 минут, 45 секунд (27.02.2009 - 19:12) Viking написал(а):
Цитата
Warning: Cannot modify header information - headers already sent by...

обычно вместо многоточия там содержится информация о файле и номере строки, где происходит отправка заголовка и даже вывод в браузер, это информация вообще может здорово помочь в поисках ошибки

Спустя 8 минут, 50 секунд (27.02.2009 - 19:21) freed-master написал(а):
Warning: Cannot modify header information - headers already sent by (output started at Z:\home\localhost\www\config.php:18) in Z:\home\localhost\www\index.php on line 17

config.php:18 - последняя строка - ?>

index.php on line 17 - строка header("location: ".$_SERVER['PHP_SELF']."?a=".rand(100,1));

Спустя 22 минуты, 13 секунд (27.02.2009 - 19:43) Viking написал(а):
Цитата
config.php:18 - последняя строка - ?>

стало быть у тебя после ?> что-то есть, может быть пробел или переносы строк

Спустя 9 минут, 26 секунд (27.02.2009 - 19:53) freed-master написал(а):
Да действительно после ?> стоял пробел.
Теперь все супер! Едем дальше...

Спустя 4 дня, 23 часа, 9 минут, 3 секунды (2.03.2009 - 19:02) freed-master написал(а):
Можноли сделать так что б, данные в БД добавлялись из экселя?
Т.е. допустим есть прайс-лист в файле .xls. В этом прайсе колонки: артикул, цена, название, и т.п. В таблице БД тоже есть колонки артикул, цена и др.
Можно ли написать скрипт, который будет сравнивать артикулы БД и xls-файла и заменять (обновлять) цены соответствующие артикулам?

Спустя 1 час, 47 минут, 16 секунд (2.03.2009 - 20:49) twin написал(а):
Обычно разбирают .csv файлы. Это формат, в котором можно сохранить страничку ексель. Такие есть скрипты. А .xls разбирать слишком гемморно. Хотя что то в сети монстроподобное попадалось...

Спустя 1 час, 3 минуты, 3 секунды (2.03.2009 - 21:52) freed-master написал(а):
Да у меня есть подобный скрипт, но он преобразует .csv в таблицу на странице html. А вот чтоб в БД заносил - это вопрос?

Спустя 11 часов, 23 минуты (3.03.2009 - 09:15) sergeiss написал(а):
Если используешь MySQL, то для загрузки CSV можно использовать LOAD DATA INFILE, а если работаешь с PostgreSQL, то используй COPY.
Ты сможешь занести файл в БД за одно действие. Очень быстро.

Спустя 7 часов, 25 минут, 11 секунд (3.03.2009 - 16:40) freed-master написал(а):
Цитата
LOAD DATA INFILE

На сколько я понял это SQL запрос. А сожноли это осушествить через ПХП интерфейс?

Спустя 1 час, 38 минут, 11 секунд (3.03.2009 - 18:18) freed-master написал(а):
Ну да ладно, это пока не самое главное.

Вопрос такого рода:
Код
$result = mysql_query("SELECT * FROM `".$section."` ") or die ("Ошибка запроса №2 : " . mysql_error());
А именно можно ли в качестве названия использовать переменную?
Браузер пишет: Incorrect table name. Может я что-то напутал?

Спустя 4 минуты, 13 секунд (3.03.2009 - 18:23) Viking написал(а):
можно, проверь, что у тебя в $section
например
... or die ("Ошибка запроса №2 : " . mysql_error()." incorrect tablename is:".$section);

Спустя 1 час, 38 минут, 4 секунды (3.03.2009 - 20:01) sergeiss написал(а):
Цитата (freed-master @ 3.03.2009 - 16:40)
Цитата
LOAD DATA INFILE

На сколько я понял это SQL запрос. А сожноли это осушествить через ПХП интерфейс?

Так, а этот запрос и введешь в ПХП smile.gif

Сначала делаешь загрузку файла на сервер, загружаешь данные из него в БД, затем удаляешь временный файл. И всё это исключительно внутри ПХП!!!

Спустя 51 минута, 44 секунды (3.03.2009 - 20:52) freed-master написал(а):
Разьясните, пожалуйста как правильно.

В SQL запросе мы вводим:
Код
SELECT FROM TABLE

На ПХП это выглядит так:
Код
mysql_query("SELECT * FROM `".$section."`")


А как будет выглядеть на ПХП такой запросик:
Код
DELETE FROM TABLE
WERE (дальше не уверен как писать) $code = $code

Т.е. мне нужно сделать кнопку напротив каждого товара для его удаления из БД

Спустя 23 часа, 53 минуты, 37 секунд (4.03.2009 - 20:46) freed-master написал(а):
Подскажите, какой тип данных выбрать для хранения цены?
Пробовал DOUBLE, но цифры после запятой (точки) не запоминаются, вернее не запоминаются ноли после запятой.
Если выбрать TEXT, возможно ли будет подсчитывать сумму в будущем?

Спустя 37 минут, 47 секунд (4.03.2009 - 21:24) bret написал(а):
Цитата
Пробовал DOUBLE, но цифры после запятой (точки) не запоминаются, вернее не запоминаются ноли после запятой.

Так тебе не надо в базе хранить нули после запятой. Перед выводом на экран отформатируешь как нужно и делов-то
РНРман

Пример 6. sprintf(): форматирование денежных величин
PHP
<?php
$money1 
68.75;
$money2 54.35;
$money $money1 $money2;
// echo $money выведет "123.1";
$formatted sprintf("%01.2f"$money);
// echo $formatted выведет "123.10"

Спустя 11 минут, 24 секунды (4.03.2009 - 21:35) freed-master написал(а):
У меня цена вставляется строкой:
Код
<?php echo htmlspecialchars($row["price"]); ?>

Т.е. нужно ранее определить:
Код
$row = sprintf("%01.2f", $price);

Что-то явно не то..

Спустя 12 минут, 31 секунда (4.03.2009 - 21:48) Viking написал(а):
вместо первой
<?php printf($row["price"]); ?>

Спустя 42 секунды (4.03.2009 - 21:48) bret написал(а):
Цитата
У меня цена вставляется строкой

Ммм, вставляется из базы7 И ты только при выводе из базы проверяешь на спецсимволы7 Архистранно
По (имхо) нормальной логике - почистили от всякой пакости, перегнали в double, записали в базу. Подсчитали сумму. При выводе на страницу отформатировали

Спустя 8 минут, 24 секунды (4.03.2009 - 21:57) freed-master написал(а):
Цитата (Viking @ 4.03.2009 - 22:48)
вместо первой
<?php printf($row["price"]); ?>

Сделал так:
Код
<?php printf("%01.2f", $row["price"]); ?>
Все работает, спасибо!

Спустя 9 минут, 40 секунд (4.03.2009 - 22:06) freed-master написал(а):
Цитата (bret @ 4.03.2009 - 22:48)
Цитата
У меня цена вставляется строкой

Ммм, вставляется из базы7 И ты только при выводе из базы проверяешь на спецсимволы7 Архистранно
По (имхо) нормальной логике - почистили от всякой пакости, перегнали в double, записали в базу. Подсчитали сумму. При выводе на страницу отформатировали

bret, очень возможно что в этом есть здравый смысл, но проблемка в том, что мне это ни о чем не говорит. Я изучаю мускул всего недели 1.5, в свободное от учебы время...

Спустя 1 час, 16 минут, 14 секунд (4.03.2009 - 23:23) freed-master написал(а):
Пытаюсь написать форму замены цены, но что-то никак.
На админ-странице есть код:
Код
<?php include "inc_form.php"; $section = "section_name"; include "inc_readoutp.php"; ?>

Файл inc_form.php:
Код
<form action="" method="post">
<table>
<tr>
<td width="130" align="right">Артикул: </td>
<td><input name="code" type="text"  value="<?php echo htmlspecialchars($code) ?>" size="51"/></td>
</tr>
<tr>
<td width="130" align="right">Наименование: </td>
<td><input name="ware" type="text"  value="<?php echo htmlspecialchars($ware) ?>" size="51"/></td>
</tr>
<tr>
<td width="130" align="right" valign="top">Описание: </td>
<td><textarea name="description" cols="40" rows="5"><?php echo htmlspecialchars($description); ?></textarea></td>
</tr>
<tr>
<td width="130" align="right">Производитель: </td>
<td><input name="producer" type="text"  value="<?php echo htmlspecialchars($producer) ?>" size="51"/></td>
</tr>
<tr>
<td width="130" align="right">Цена: </td>
<td><input name="price" type="text"  value="<?php echo htmlspecialchars($price) ?>" size="51"/></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input name="ok" type="submit" value="Добавить товар" /></td>
</tr>
</table>
</form>

Файл inc_readoutp.php:
Код
<?php
include_once("config.php");
$result = mysql_query("SELECT * FROM `".$section."` ") or die ("Ошибка запроса №2 : " . mysql_error());
while($row = mysql_fetch_assoc($result))
{
?>
<tr>
<td width="100"><?php echo htmlspecialchars($row["code"]); ?></td>
<td><?php echo htmlspecialchars($row["ware"]); ?></td>
<td width="75"><?php printf("%01.2f", $row["price"]); ?> грн.</td>
<td align="right" width="150">
<?php
if(isset($_POST['edit'])){
mysql_query("UPDATE `".$section."` SET `price`='".$price."' ", $sql) or die ("Ошибка запроса: " . mysql_error());
}else{echo "";}
?>
<form action="?" method="post">
<input name="price" type="text" id="price" size="4" />
<input name="edit" type="submit" id="edit" value="Изменить" />
</form></td>
</tr>
<?php
}
?>

Но при таком раскладе, после нажатия "Изменить" цена меняется во всех товарах таблицы $section.
А вот как сделать так чтоб менялась только там где надо?

Спустя 20 часов, 3 минуты, 7 секунд (5.03.2009 - 19:26) bret написал(а):
А как скрипт узнаёт, для какого именно товара ты хочешь поменять цену7
Подсказка
Твоему запросу явно не хватает WHERE

Спустя 20 минут, 16 секунд (5.03.2009 - 19:46) freed-master написал(а):
В том то и дело. Как определить этот WHERE? Допустим по артикулу. Что ли так:
Код
mysql_query("UPDATE `".$section."` SET `price`='".$price."' WHERE `code`='".$code."", $sql)
Бред како-то..

Спустя 1 день, 40 минут, 45 секунд (6.03.2009 - 20:27) freed-master написал(а):
Неужели нет никаких мыслей по этому поводу?

Спустя 12 минут, 28 секунд (6.03.2009 - 20:39) twin написал(а):
Ну почему нет... просто ответ настолько очевиден, что все посчитали что ты давно справился сам. Ты же редактируешь какую то определенную цену, вот нужно получить id этой строки, прописать каким нибудь параметром в форму и по нему уже определять WHERE. Или скрытым полем, или GET параметром формы или сессией на худой конец.

Спустя 3 минуты, 55 секунд (6.03.2009 - 20:43) freed-master написал(а):
На словах то оно очевидно, но на практике что-то не получается...
Что здесь не верно:
Код
<?php
include_once("config.php");
$result = mysql_query("SELECT * FROM `".$section."` ") or die ("Ошибка запроса №2 : " . mysql_error());
while($row = mysql_fetch_assoc($result))
{
?>
<tr>
<td width="120"><?php echo htmlspecialchars($row["code"]); ?></td>
<td><?php echo htmlspecialchars($row["ware"]); ?></td>
<td width="100"><?php
if ($row["price"] == 0) echo "Нет в наличии";
else printf("%01.2f", $row["price"]); ?>
</td>
<td align="right" width="150">
<?php
if(isset($_POST['edit'])){
mysql_query("UPDATE `".$section."` SET `price`='".$newprice."' WHERE `code`='".$warecode."", $sql) or die ("Ошибка запроса: " . mysql_error());
}else{echo "";}
?>
<form action="?" method="post">
<input name="newprice" type="text" size="4" />
<input name="warecode" type="hidden" value="<?php echo htmlspecialchars($row["code"]); ?>" />
<input name="edit" type="submit" value="Изменить" />
</form>
</td>
</tr>
<?php
}
?>

Спустя 32 минуты, 30 секунд (6.03.2009 - 21:16) twin написал(а):
Н почему сразу не правильно... Просто не доделано. Ведь товаров выводится куча, а откуда скрипт узнает, какой именно редактировать? нужно это обозначить как то. Чекбоксом например или лучше радиокнопкой. А ей уже прописать id строки.

Спустя 5 минут, 41 секунда (6.03.2009 - 21:21) twin написал(а):
Вот тут посмотри, я недавно подобное писал. Можешь помучать, это просто демка.

Спустя 11 минут, 20 секунд (6.03.2009 - 21:33) freed-master написал(а):
Что то пока не доганяю. Догнал только то что пытался присвоить целый масив, наверно это не есть правильно!

Возможно я не правильно сформулировал мысль.
В твоем варианте: все товары в одной форме; чтобы редактировать товар - надо поставить флажок на против него.

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

Т.е. мене не годится вариант: для редактирования открывать новую страницу. Вот здесь я и завис...

Спустя 1 час, 59 секунд (6.03.2009 - 22:34) twin написал(а):
Ну я же уже предлагал форму к примеру снабдить параметром. Ну вот так:

HTML
<form action="?id=<?php echo $row["id"] ?>" method="post">


Потом ловить его и по нему уже выбирать нужную запись... Или я опять чего то не понял?

Спустя 30 минут, 26 секунд (6.03.2009 - 23:04) freed-master написал(а):
...запутался. т.е. ловить? как то так?:
Код
<?php
if(isset($_POST['edit'])){
mysql_query("UPDATE `".$section."` SET `price`='".$newprice."' WHERE `code`='".$id."", $sql) or die ("Ошибка запроса: " . mysql_error());
}else{echo "";}
?>
<form action="?id=<?php echo $row["code"] ?>" method="post">
<input name="newprice" type="text" size="4" />
<input name="edit" type="submit" value="Изменить" />
</form>

Спустя 4 минуты, 21 секунда (6.03.2009 - 23:08) twin написал(а):
Да, примерно так. Только нужно переменную объяыить явно, не используя глобалс.
PHP
<?
$id = isset($_GET['code'])?(int)$_GET['code']:NULL;

Спустя 6 минут, 29 секунд (6.03.2009 - 23:15) freed-master написал(а):
Хм... или я совсем дурак (ну в смысле устал:) или...?
Код
<?php
include_once("config.php");
$result = mysql_query("SELECT * FROM `".$section."` ") or die ("Ошибка запроса №2 : " . mysql_error());
while($row = mysql_fetch_assoc($result))
{
?>
<tr>
<td width="120"><?php echo htmlspecialchars($row["code"]); ?></td>
<td><?php echo htmlspecialchars($row["ware"]); ?></td>
<td width="100"><?php
if ($row["price"] == 0) echo "Нет в наличии";
else printf("%01.2f", $row["price"]); ?>
</td>
<td align="right" width="150">
<?php
$id = isset($_POST['code'])?(int)$_POST['code']:NULL;
if(isset($_POST['edit'])){
mysql_query("UPDATE `".$section."` SET `price`='".$newprice."' WHERE `code`='".$id."", $sql) or die ("Ошибка запроса: " . mysql_error());
}else{echo "";}
?>
<form action="?id=<?php echo $row["code"] ?>" method="post"><input name="newprice" type="text" size="4" /><input name="edit" type="submit" value="Изменить" /></form>
</td>
</tr>
<?php
}
?>

Спустя 24 минуты, 54 секунды (6.03.2009 - 23:40) twin написал(а):
Вот это зачем в цикле то? Прямо под инклюд с конфигой сунь. И переменну. как я написал сюда же.

PHP
if(isset($_POST['edit'])){
$id = ......................................
mysql_query("UPDATE `".$section."` SET `price`='".$newprice."' WHERE `code`='".$id."", $sql) or die ("Ошибка запроса: " . mysql_error());
}else{
echo "";}

ЗЫ А это вообще зачем: else{echo "";}?

Спустя 11 минут, 46 секунд (6.03.2009 - 23:52) freed-master написал(а):
Цитата
ЗЫ А это вообще зачем: else{echo "";}?

Да это вобщем то просто моя "затурканость". За основу беру готовые кусочки кода разных подобных скриптов, пытаюсь понять как они работают, после переделываю подганяю, добавляю и т.п.

Так что ли?:
Код
<?php
include_once("config.php");

if(isset($_POST['edit'])){
$id = isset($_GET['code'])?(int)$_GET['code']:null;
mysql_query("UPDATE `".$section."` SET `price`='".$newprice."' WHERE `code`='".$id."", $sql) or die ("Ошибка запроса: " . mysql_error());
}else{echo "";}

$result = mysql_query("SELECT * FROM `".$section."` ") or die ("Ошибка запроса №2 : " . mysql_error());

while($row = mysql_fetch_assoc($result))
{
?>
<tr>
<td width="120"><?php echo htmlspecialchars($row["code"]); ?></td>
<td><?php echo htmlspecialchars($row["ware"]); ?></td>
<td width="100"><?php
if ($row["price"] == 0) echo "Нет в наличии";
else printf("%01.2f", $row["price"]); ?>
</td>
<td align="right" width="150">
<form action="?id=<?php echo $row["code"]; ?>" method="post"><input name="newprice" type="text" size="4" /><input name="edit" type="submit" value="Изменить" /></form>
</td>
</tr>
<?php
}
?>

В результате снова:
Код
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1

Спустя 4 минуты, 56 секунд (6.03.2009 - 23:57) twin написал(а):
Не, мастер-класс точно делать нельзя... Совсем думать перестаете smile.gif
Ну написано же - синтаксическая ошибка в запросе. Посмотри внимательно:
`code`='".$id."", Всё на месте?

Спустя 10 минут, 30 секунд (7.03.2009 - 00:07) freed-master написал(а):
Да, действительно надо быть внимательнее. Ошибка исчезла, но в таблицу БД значение не записывается...

Спустя 9 минут, 54 секунды (7.03.2009 - 00:17) twin написал(а):
Ну а откуда что там возьмётся то? Вот эту переменную $newprice тож надо инициализировать.

Спустя 22 минуты, 48 секунд (7.03.2009 - 00:40) freed-master написал(а):
Сделал, но снова где то напортачил:
Код
<?php
include_once("config.php");
if(isset($_POST['edit'])){
$id = isset($_GET['code'])?(int)$_GET['code']:null;
$newprice = isset($_POST['price'])?$_POST['price']:null;
mysql_query("UPDATE `".$section."` SET `price`='".$newprice."' WHERE `code`='".$id."'", $sql) or die ("Ошибка запроса: " . mysql_error());
}else{echo "";}
$result = mysql_query("SELECT * FROM `".$section."` ") or die ("Ошибка запроса №2 : " . mysql_error());
while($row = mysql_fetch_assoc($result))
{
?>
<tr>
<td width="120"><?php echo htmlspecialchars($row["code"]); ?></td>
<td><?php echo htmlspecialchars($row["ware"]); ?></td>
<td width="100"><?php
if ($row["price"] == 0) echo "Нет в наличии";
else printf("%01.2f", $row["price"]); ?>
</td>
<td align="right" width="150">
<form action="?id=<?php echo $row["code"]; ?>" method="post"><input name="newprice" type="text" size="4" /><input name="edit" type="submit" value="Изменить" /></form>
</td>
</tr>
<?php
}
?>

Че то не то. На сегодня пожалуй хватит, мозги плавятся.
На последок лишь спрошу - что делает int?:
Код
$id = isset($_GET['code'])?(int)$_GET['code']:null;

Спустя 30 минут, 56 секунд (7.03.2009 - 01:11) twin написал(а):
(int) или intval() приводят значение переменной к целому числу. То есть буквы не пролезут. Это для защиты от инъекций. Вот кстати, в этом самом code букв нет случайно?

Спустя 12 часов, 32 минуты, 11 секунд (7.03.2009 - 13:43) freed-master написал(а):
Вот кстати в этом само code буквы ЕСТЬ, еще есть точки и черточки!

Спустя 8 минут, 34 секунды (7.03.2009 - 13:51) twin написал(а):
Ну тогда надо mesql_escape_string($_GET['code']). Только это неправильно. Потому что нужно искать не по коду (как я понял артикулу), а по полю с автоинкрементом. Обычно это id (от слова ИДентификатор). Иначе не будет стопроцентной уверенности в уникальности записи. Артикул может и повториться, специально или случайно, не суть.

Спустя 8 минут, 20 секунд (7.03.2009 - 14:00) freed-master написал(а):
Что такое id я в курсе, а вот на счет того что артикул может повторяться не согласен. При попытке добавить существующий code пишется что такой уже существует.

Спустя 22 часа, 36 минут, 7 секунд (8.03.2009 - 12:36) freed-master написал(а):
Без (int) тоже не работает:
Код
$id = isset($_GET['code'])?$_GET['code']:null;

Спустя 21 час, 26 минут, 11 секунд (9.03.2009 - 10:02) freed-master написал(а):
Заменив
Код
<form action="?id=<?php echo $row["id"] ?>" method="post">
На
Код
<form action="?code=<?php echo $row["id"] ?>" method="post">
В БД записывается ноль
???

Спустя 18 минут, 22 секунды (9.03.2009 - 10:20) freed-master написал(а):
Наконец то я разобрался!!!
Благодарю, за то что не отвечали, тем самым заставили меня пошевелшить мозгами. На самом деле вказалось все как всегда на много проще.
Вот исправленный код:
Код
<?php
include_once("config.php");

isset($_POST['edit']);
$id = isset($_GET['code'])?$_GET['code']:null;
$newprice = isset($_POST['nprice'])?$_POST['nprice']:null;

mysql_query("UPDATE `".$section."` SET `price`='".$newprice."' WHERE `code`='".$id."'", $sql) or die ("Ошибка запроса: " . mysql_error());
$result = mysql_query("SELECT * FROM `".$section."` ") or die ("Ошибка запроса №2 : " . mysql_error());
while($row = mysql_fetch_assoc($result))
{
?>
<tr>
<td width="120"><?php echo htmlspecialchars($row["code"]); ?></td>
<td><?php echo htmlspecialchars($row["ware"]); ?></td>
<td width="100"><?php
if ($row["price"] == 0) echo "Нет в наличии";
else printf("%01.2f", $row["price"]); ?>
</td>
<td align="right" width="150">
<form action="?code=<?php echo $row["code"]; ?>" method="post"><input name="nprice" type="text" size="4" /><input name="edit" type="submit" value="Изменить" /></form>
</td>
</tr>
<?php
}
?>

Спустя 2 минуты, 19 секунд (9.03.2009 - 10:23) twin написал(а):

Почти правильно. Только все таки так:

PHP
$code = isset($_GET['code'])?mesql_escape_string($_GET['code']):null;
$newprice = isset($_POST['price'])?$_POST['price']:null;
mysql_query("UPDATE `".$section."` SET `price`='".$newprice."' WHERE `code`='".$code."'"$sql) or die ("Ошибка запроса: " mysql_error());
Только следи за тем, что бы магические кавычки были отключены.

Спустя 6 минут, 47 секунд (9.03.2009 - 10:30) freed-master написал(а):
Магические кавычки?
ЗЫ
Опечаточка вышла не mesql_escape_string а mysql_escape_string

Спустя 39 минут, 50 секунд (9.03.2009 - 11:09) twin написал(а):
Доректива magic_quotes_gpc в настройках сервера часто бывает включена по умолчанию. Это значит, что все кавычки во входящих данных GET POST и COOKIE (gpc) будут автоматически экранированы. То есть получится двойное экранирование и выйдет лажа. Эту директиву лучше отключать в ini или .htaccess

PS
Цитата
Опечаточка вышла
На то и мыши, чтоб кот не спал biggrin.gif

Спустя 17 минут, 30 секунд (9.03.2009 - 11:27) freed-master написал(а):
А как её отключить в .htaccess?

Спустя 26 минут, 57 секунд (9.03.2009 - 11:54) twin написал(а):
в .htaccess лучше сразу писать

Код
php_flag magic_quotes_gpc Off
php_flag magic_quotes_runtime Off
php_flag register_globals Off


лишним никогда не будет smile.gif

Спустя 3 часа, 25 минут, 8 секунд (9.03.2009 - 15:19) freed-master написал(а):
По анологии пытался сделать кнопку удаления из БД:
Код
if (isset($_POST['delete'])) {
$code = isset($_GET['code'])?mysql_escape_string($_GET['code']):null;
mysql_query("DELETE * FROM `".$section."` WHERE `code`='".$code."'", $sql) or die ("Ошибка запроса: " . mysql_error()); }

<form action="?code=<?php echo $row["code"]; ?>" method="post">
<input name="delete" type="image" src="../images/del.png" alt="Удалить товар" />
</form>

???

Спустя 4 часа, 13 минут, 24 секунды (9.03.2009 - 19:32) bret написал(а):
PHP
$r null;
if(isset(
$r))
 print(
"Yes");
else
 print(
"No");

Проверил в MagicPHP этот код - выдал "No"
Т.е. то, что у тебя по факту - переменная вроде передаётся, но значения не имеет (имеет значение null).

Подскажу - попробуй передать переменую с каким-то значением

Спустя 24 минуты, 55 секунд (9.03.2009 - 19:57) freed-master написал(а):
Например? Добавить скрытое поле или как?
Ведь, в варианте с заменой переменныя передается и все работает.

Спустя 5 часов, 28 минут, 2 секунды (10.03.2009 - 01:25) twin написал(а):
Знач все очень просто. Когда есть такой затык, надо делать
PHP
print_r($_POST);
Все дело в том, что <input type="image"/> передает не имя, а координаты. Выбери себу понравившейся элемент из массива и ориентируйся на него, а не на name="delete".

Спустя 5 часов, 42 минуты, 9 секунд (10.03.2009 - 07:07) freed-master написал(а):
Не понял.
Цитата
понравившейся элемент из массива и ориентируйся на него, а не на name="delete".
Заменить это:
Код
if (isset($_POST['delete']))
И добавить что-то сюда:
Код
<input name="delete" type="image" src="../images/del.png" alt="Удалить товар" />

Спустя 9 минут, 41 секунда (10.03.2009 - 07:17) freed-master написал(а):
Цитата (twin @ 9.03.2009 - 12:54)
в .htaccess лучше сразу писать

Код
php_flag magic_quotes_gpc Off
php_flag magic_quotes_runtime Off
php_flag register_globals Off


лишним никогда не будет smile.gif

Оказывается на сервере нужно прописать в пхп.ини.
Это надо найти этот ини там или написать свой с этой частью когда и положить в корень?

Спустя 7 минут, 22 секунды (10.03.2009 - 07:25) kirik написал(а):
Цитата (freed-master @ 9.03.2009 - 23:17)
Оказывается на сервере нужно прописать в пхп.ини.

А в .htaccess не работает?

Спустя 20 минут, 57 секунд (10.03.2009 - 07:45) twin написал(а):
Цитата
Не понял.

Самой верхней строчкой скрипта напиши это:
PHP
print_r($_POST);
нажми свою кнопку и посмотри, что выйдет. В массиве будет что то типа
Код
Array ( [a] => [delete_x] => 100 [delete_y] => 200 )
Это координаты кнопки. Любую из них можно написать вместо
PHP
if (isset($_POST['delete']))
. Допустим
PHP
if (isset($_POST['delete_x']))


Цитата
Оказывается на сервере нужно прописать в пхп.ини.
Обычно хостеры не дают доступа к php.ini по этому для тонкой настройки используется .htaccess Работант он для файлов директории, в которой лежит и для всех фалов во вложенных директориях. Но недавно попался такой хостинг, где все наоборот. Не работает .htaccess за то .ini - пожалуйста. Так что смотреть нужно по месту.

Спустя 7 часов, 30 минут, 44 секунды (10.03.2009 - 15:16) freed-master написал(а):
Цитата
А в .htaccess не работает?

Вобще ни одна страница не открывается - Ошибка 500
В тех поддержке сказали что из-зи .htaccess сказали надо в пхп.ини (вот правда этого пхп.ини я нигде не видел)
Удалил .htaccess и точно все заработало. Может мне вообще и не надо ниче менять?

print_r($_POST); выводит много Array ( ) Значит вобще ничего не передается?
Уточню: форма и скрипт замены находится на одной странице с формой и скриптом удаления:
Код
<?php
include_once("config.php");

print_r($_POST);

if (isset($_POST['edit'])) {
$code = isset($_GET['code'])?mysql_escape_string($_GET['code']):null;
$newprice = isset($_POST['nprice'])?$_POST['nprice']:null;
mysql_query("UPDATE `".$section."` SET `price`='".$newprice."' WHERE `code`='".$code."'", $sql) or die ("Ошибка запроса: " . mysql_error()); }

if (isset($_POST['delete'])) {
$code = isset($_GET['code'])?mysql_escape_string($_GET['code']):null;
mysql_query("DELETE * FROM `".$section."` WHERE `code`='".$code."'", $sql) or die ("Ошибка запроса: " . mysql_error()); }

$result = mysql_query("SELECT * FROM `".$section."` ") or die ("Ошибка запроса: " . mysql_error());
while($row = mysql_fetch_assoc($result))
{
?>
<tr>
<td width="120"><?php echo htmlspecialchars($row["code"]); ?></td>
<td><?php echo htmlspecialchars($row["ware"]); ?></td>
<td width="50"><?php
if ($row["price"] == 0) echo "Нет";
else printf("%01.2f", $row["price"]); ?>
</td>
<td align="right" width="150">
<form action="?code=<?php echo $row["code"]; ?>" method="post"><input name="nprice" type="text" size="4" /><input name="edit" type="submit" value="Изменить" /></form>
<td align="center" width="30">
<form action="?code=<?php echo $row["code"]; ?>" method="post"><input name="delete" type="image" src="../images/del.png" alt="Удалить товар" /></form>
</td>
</td>
</tr>
<?php } ?>


Спустя 1 час, 48 секунд (10.03.2009 - 16:17) twin написал(а):
А какой хостинг, если не тайна?
А по поводу - я жу уже готовое решение написал. Если
Цитата
print_r($_POST); выводит много Array ( )
то это хорошо. Хуже когда ничего не выдает biggrin.gif .

Спустя 8 минут, 27 секунд (10.03.2009 - 16:25) freed-master написал(а):
Чего уж тут скрывать - http://www.abris.com.ua/

О! А если заменить цену в каком-либо товаре, то вместо всех Array ( ) пишет Array ( [nprice] => 8 [edit] => Изменить )

А теперь после нажатия кнопки "удалить", вывел что-то типа: Array ( [delete_x] => 6 [delete_y] => 5 )

Меняю if (isset($_POST['delete'])) на if (isset($_POST['delete_х'])) и при повторном нажатии "удалить" пишет:
Цитата
Array ( [delete_x] => 6 [delete_y] => 5 ) Ошибка запроса: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM `wares_paper_a3` WHERE `code`='254445'' at line 1

`wares_paper_a3` - это первая таблица в БД.

Спустя 43 минуты, 53 секунды (10.03.2009 - 17:09) twin написал(а):
Не пишется * в DELETE. Он и так все снесет.

Спустя 46 минут, 13 секунд (10.03.2009 - 17:56) freed-master написал(а):
Мда, растянулась темка...

Огрмная благодарность всем участникам за терпение и понимание!

Спустя 1 день, 1 час, 58 минут, 40 секунд (11.03.2009 - 19:54) bret написал(а):
А всего-то надо было в
HTML
<input name="delete" type="image" src="../images/del.png" alt="Удалить товар" />

добавить value
HTML
<input name="delete" type="image" src="../images/del.png" alt="Удалить товар" value="bI" />

unsure.gif


_____________
Всем, кто заинтересован, могу помочь начать зарабатывать на forex.
Пишите в личку или на e-mail: flash-dirt@yandex.ru
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.