В админке я сделал функцию добавления страницы
(нажимаю add page и выходит форма, куда нужно заполнить name - название страницы и имя создаваемого файла-,
text - содержание страницы -, и image - загрузка картинки на страницу). Часть файла обработки 1.php, которая вызывает у меня проблемы
$text=$_POST['text'];
$id=$_POST['id'];
$submit=$_POST['submit'];
$name=$_POST['name'];
$filename=$_POST['filename'];
$_SESSION['name'] = $name;
$z="about.php"; //беру готовый шаблон файла
$p=fopen($z,"r");
flock($p,LOCK_EX);
$n=fread($p, filesize($z));
flock($p,LOCK_UN);
fclose($p);
$new=$name.".php";//есть
$m=fopen($new, "w+");
flock($m,LOCK_EX);
fwrite($m,$n);
flock($m,LOCK_UN);
fclose($m);
$file = fopen($name.".php", 'r'); //создаю файл с указанным в форме именем
$text = fread($file, filesize($name.".php"));
fclose($file);
$file = fopen($name.".php", 'w');
$text= str_replace('About', '$name', $text);
/*!!!(проблемное место) Это строка заменяет в запросе созданного файла по шаблону about.php about на name
$result2 = mysql_query("SELECT text FROM text WHERE name='About'",$db);
И всё замечательно выводится (текст и т.д.),
но если я захочу создать ещё одну страницу, то переменная name меняется,
т.к. передаю её через сессию и предыдущая страница выводит текст новой созданной страницы.
Таким образом все страницы выводят текст текст только последней созданной страницы.
Подскажите, как это исправить, уже всю голову поломал.
Может нужен принципиально новый подход к добавлению текста, а не через переменную, как это делаю я.
*/
$text= str_replace('FROM text', 'FROM s1', $text);
$text= str_replace('../../img/', 'images/', $text);
$text= str_replace('375', '<?php echo $_SESSION[\'width\']; ?>', $text);
$text= str_replace('224', '<?php echo $_SESSION[\'height\'];?>', $text);
$text= str_replace('415', '<?php echo $_SESSION[\'width\']+30; ?>', $text);
$text= str_replace('248', '<?php echo $_SESSION[\'height\']+20; ?>', $text);
$text= str_replace('vzgliad.jpg',$_FILES["filename"]["name"], $text);
fwrite($file, $text);
fclose($file);
header("Location: $name.php");
P.S. Заранее благодарен за любую помощь
Спустя 8 минут, 18 секунд (21.03.2010 - 15:18) Игорь_Vasinsky написал(а):
Цитата |
header("Location: $name.php"); |
разве у тебя есть переменная $name.php ?
синтаксис $name.".php"
Цитата |
Таким образом все страницы выводят текст текст только последней созданной страницы |
а как ты вызаваешь только что созданную страницу ?
делаешь вывод созданных страниц из БД ?
Спустя 5 минут, 28 секунд (21.03.2010 - 15:23) Guest написал(а):
В конце файла обработки пишу header("Location: $name."php");
Далее открывается только что созданный файл
<?php
include ("../blocks/proverka.php");
include ("../blocks/bd.php");
@mysql_query("SET NAMES cp1251");
$result2 = mysql_query("SELECT * FROM s1 WHERE name='$name'",$db);
$myrow2 = mysql_fetch_array($result2);// вытаскиваем данные
?>
И дальше просто вывожу <?php echo $myrow2['text']; ?>
Но переменная name меняется с каждым новым заполнением формы, соответсвенно мекст на всех страницах такой же, как и у последней созданной страницы
Далее открывается только что созданный файл
<?php
include ("../blocks/proverka.php");
include ("../blocks/bd.php");
@mysql_query("SET NAMES cp1251");
$result2 = mysql_query("SELECT * FROM s1 WHERE name='$name'",$db);
$myrow2 = mysql_fetch_array($result2);// вытаскиваем данные
?>
И дальше просто вывожу <?php echo $myrow2['text']; ?>
Но переменная name меняется с каждым новым заполнением формы, соответсвенно мекст на всех страницах такой же, как и у последней созданной страницы
Спустя 4 минуты, 36 секунд (21.03.2010 - 15:28) Игорь_Vasinsky написал(а):
А как данные в БД заносишь о созданных страницах ?
name | text | image | date ?
в таком формате данные хранишь о созданных страницах ?
name | text | image | date ?
в таком формате данные хранишь о созданных страницах ?
Спустя 1 минута, 42 секунды (21.03.2010 - 15:30) Guest написал(а):
В файле обработке прописываю
$result35=mysql_query("INSERT INTO s1 (name, text) VALUES ('$name','$text')");
$result35=mysql_query("INSERT INTO s1 (name, text) VALUES ('$name','$text')");
Спустя 3 минуты, 25 секунд (21.03.2010 - 15:33) Игорь_Vasinsky написал(а):
Ну если ты так хранишь (с учётом того что они так и записываются) то при вызове страницы проблем быть не должно.
Создай новую стрницу - с текстом - посмотри в phpmyadmin - запись верна или нет
Создай новую стрницу - с текстом - посмотри в phpmyadmin - запись верна или нет
Спустя 7 минут, 24 секунды (21.03.2010 - 15:40) Guest написал(а):
В БД всё хранится верно, просто передать саму переменную name "корректно" не могу. Я её ведь зарегистрировал в сессию (хотя для данного случая этот вариант вряд ли подходит) и она каждый раз меняется. Пример:
я в форму ввоже
name hello
text hello
($name='hello';)
теперь в созданном файле name php
$result2 = mysql_query("SELECT * FROM s1 WHERE name='hello'",$db);
Но (!), если я опять создаю файл
name hello2
text hello2
то теперь уже $name='hello2';
и как в файле hello.php, так и в файле hello2.php
$result2 = mysql_query("SELECT * FROM s1 WHERE name='hello2'",$db);
Поэтому текст выводится только с последней созданной страницы
я в форму ввоже
name hello
text hello
($name='hello';)
теперь в созданном файле name php
$result2 = mysql_query("SELECT * FROM s1 WHERE name='hello'",$db);
Но (!), если я опять создаю файл
name hello2
text hello2
то теперь уже $name='hello2';
и как в файле hello.php, так и в файле hello2.php
$result2 = mysql_query("SELECT * FROM s1 WHERE name='hello2'",$db);
Поэтому текст выводится только с последней созданной страницы
Спустя 5 минут, 28 секунд (21.03.2010 - 15:46) Игорь_Vasinsky написал(а):
Цитата |
$result2 = mysql_query("SELECT * FROM s1 WHERE name='hello2'",$db); Поэтому текст выводится только с последней созданной страницы |
ты запутал...
ты когда записываешь в БД данные о странице -> записываешь
name ------> $_POST['name']
text --------> $_POST['text']
для чего тебе сессия и причём тут вообще она ?
Я тебя понять не могу, листинг страницы где запись в БД и вывод из БД покажи
Спустя 5 минут, 12 секунд (21.03.2010 - 15:51) Guest написал(а):
<?php
include ("../blocks/proverka.php");
include ("../blocks/bd.php");
@mysql_query("SET NAMES cp1251");
$text=$_POST['text'];
$id=$_POST['id'];
$submit=$_POST['submit'];
$name=$_POST['name'];
$filename=$_POST['filename'];
$_SESSION['name'] = $name;
switch ($id) {
case 1:
if($_FILES["filename"]["size"] > 1024*3*1024)
{
echo ("Размер файла превышает три мегабайта");
exit;
}
if(copy($_FILES["filename"]["tmp_name"],
"images/".$_FILES["filename"]["name"]))
$img=$_FILES["filename"]["name"];
$size= getimagesize("images/$img");
$_SESSION['width']=$size[0];
$_SESSION['height']=$size[1];
{
$result35=mysql_query("INSERT INTO s1 (name, text) VALUES ('$name','$text')");
$z="about.php";
$p=fopen($z,"r");
flock($p,LOCK_EX);
$n=fread($p, filesize($z));
flock($p,LOCK_UN);
fclose($p);
$new=$name.".php";//есть
$m=fopen($new, "w+");
flock($m,LOCK_EX);
fwrite($m,$n);
flock($m,LOCK_UN);
fclose($m);
$file = fopen($name.".php", 'r');
$text = fread($file, filesize($name.".php"));
fclose($file);
$file = fopen($name.".php", 'w');
$text= str_replace('About', '$name', $text);
/*сессию использую, чтобы передать переменную только что созданному файлу, но это не вариант*/
$text= str_replace('FROM text', 'FROM s1', $text);
$text= str_replace('../../img/', 'images/', $text);
$text= str_replace('375', '<?php echo $_SESSION[\'width\']; ?>', $text);
$text= str_replace('224', '<?php echo $_SESSION[\'height\'];?>', $text);
$text= str_replace('415', '<?php echo $_SESSION[\'width\']+30; ?>', $text);
$text= str_replace('248', '<?php echo $_SESSION[\'height\']+20; ?>', $text);
$text= str_replace('vzgliad.jpg',$_FILES["filename"]["name"], $text);
fwrite($file, $text);
fclose($file);
header("Location: $name.php");
}; break;
default: print("Ошибка");
}
?>
include ("../blocks/proverka.php");
include ("../blocks/bd.php");
@mysql_query("SET NAMES cp1251");
$text=$_POST['text'];
$id=$_POST['id'];
$submit=$_POST['submit'];
$name=$_POST['name'];
$filename=$_POST['filename'];
$_SESSION['name'] = $name;
switch ($id) {
case 1:
if($_FILES["filename"]["size"] > 1024*3*1024)
{
echo ("Размер файла превышает три мегабайта");
exit;
}
if(copy($_FILES["filename"]["tmp_name"],
"images/".$_FILES["filename"]["name"]))
$img=$_FILES["filename"]["name"];
$size= getimagesize("images/$img");
$_SESSION['width']=$size[0];
$_SESSION['height']=$size[1];
{
$result35=mysql_query("INSERT INTO s1 (name, text) VALUES ('$name','$text')");
$z="about.php";
$p=fopen($z,"r");
flock($p,LOCK_EX);
$n=fread($p, filesize($z));
flock($p,LOCK_UN);
fclose($p);
$new=$name.".php";//есть
$m=fopen($new, "w+");
flock($m,LOCK_EX);
fwrite($m,$n);
flock($m,LOCK_UN);
fclose($m);
$file = fopen($name.".php", 'r');
$text = fread($file, filesize($name.".php"));
fclose($file);
$file = fopen($name.".php", 'w');
$text= str_replace('About', '$name', $text);
/*сессию использую, чтобы передать переменную только что созданному файлу, но это не вариант*/
$text= str_replace('FROM text', 'FROM s1', $text);
$text= str_replace('../../img/', 'images/', $text);
$text= str_replace('375', '<?php echo $_SESSION[\'width\']; ?>', $text);
$text= str_replace('224', '<?php echo $_SESSION[\'height\'];?>', $text);
$text= str_replace('415', '<?php echo $_SESSION[\'width\']+30; ?>', $text);
$text= str_replace('248', '<?php echo $_SESSION[\'height\']+20; ?>', $text);
$text= str_replace('vzgliad.jpg',$_FILES["filename"]["name"], $text);
fwrite($file, $text);
fclose($file);
header("Location: $name.php");
}; break;
default: print("Ошибка");
}
?>
Спустя 10 минут, 21 секунда (21.03.2010 - 16:01) Игорь_Vasinsky написал(а):
Слушай или я тупой или лыжи не едут, зачем тебе база если ты физически страницы создаёшь ?
если используешь базу то вот:
Смотри как последовательность действий долна быть по моему убеждению
из формы ты отправляем name и text
СТруктура таблицы в БД, но без картинки - сам добавь
id | name | название | text |
1 page1.php первая страница новая страница page1.php бла бла бла
2 page2.php вторая страница новая страница page2.php бла бла бла
потом из формы все данные заносишь в неё (id разумеется auto_increment)
для вывода нужной страниц делаешь ссылки типа
<a href="$page['name']">$page['название']</a>
и от этого id gj GET - вытаскиваешь всю страницу из базы,
и весь запрос к базе либо по ID либо можешь по name
Спустя 3 минуты, 7 секунд (21.03.2010 - 16:05) Игорь_Vasinsky написал(а):
Цитата |
$z="about.php"; |
если ты думаешь что перёшь страницу как шаблон, то это заблуждение, работа с шаьблонами имеет другой алгортм,
ты создаёшь физически статические страницы
как тут about.php мне вообще не ясно
Спустя 4 минуты, 23 секунды (21.03.2010 - 16:09) Night User написал(а):
about.php - ТС открывает его fopen'ом и делает замену. потом пишет замененный текст в новый файл
Спустя 2 минуты, 30 секунд (21.03.2010 - 16:11) Guest написал(а):
Я имел в виду, что я беру страницу готовую, на её основе создаю новую (с таким же содержанием) и заменяю необходимые мне строки. То, что я создаю физически статические страницы - это да. Вроде появилась мысля...щас попробую твой вариант. Отпишусь скоро
P.S. Спасибо тебе большое за помошь
P.S. Спасибо тебе большое за помошь
Спустя 37 секунд (21.03.2010 - 16:12) Игорь_Vasinsky написал(а):
Цитата |
about.php - ТС открывает его fopen'ом и делает замену |
ну если так то нужно же файл во временную директорию и сменить имя и обратно скопировать, так выходить что он один about.php _ парит и думает что от этого страницы создаются.... зачем парится - создовать проще динамические страницы
Спустя 5 минут, 1 секунда (21.03.2010 - 16:17) Night User написал(а):
Тут ТС пытается создать файл
только если прочитать логику скрипта, то примерно так получается:
читаем about.php
создаем пустой $name.php
закрываем $name.php
открываем $name.php для чтения, читаем, зыкрываем
открываем $name.php для записи, делаем замену в только что прочтенном, записываем
зачем так сложно о_О ?!
$new=$name.".php";//есть
$m=fopen($new, "w+");
flock($m,LOCK_EX);
fwrite($m,$n);
flock($m,LOCK_UN);
fclose($m);
только если прочитать логику скрипта, то примерно так получается:
читаем about.php
создаем пустой $name.php
закрываем $name.php
открываем $name.php для чтения, читаем, зыкрываем
открываем $name.php для записи, делаем замену в только что прочтенном, записываем
зачем так сложно о_О ?!
Спустя 1 минута, 16 секунд (21.03.2010 - 16:18) Guest написал(а):
А как создавать динамические страницы?
Спустя 2 минуты, 26 секунд (21.03.2010 - 16:21) Игорь_Vasinsky написал(а):
Цитата |
только если прочитать логику скрипта, то примерно так получается: читаем about.php |
я так понял он его от нечего делать взял и прочитал... а чё если время есть...
ещёб проверку на наличие файла с таким именем бы не плохо... всё равно не пойму - мой приоритет -> динамически создоваемые страницы.
Спустя 2 минуты, 53 секунды (21.03.2010 - 16:24) Guest написал(а):
Night User
$new=$name.".php";//есть
$m=fopen($new, "w+");
flock($m,LOCK_EX);
fwrite($m,$n);
flock($m,LOCK_UN);
fclose($m);
только если прочитать логику скрипта, то примерно так получается:
читаем about.php
создаем пустой $name.php
блокируем $name.php
открываем $name.php для чтения, читаем, зыкрываем
открываем $name.php для записи, делаем замену в только что прочтенном, записываем
Хотя для админки это лишнее...просто пока это черновой вариант
$new=$name.".php";//есть
$m=fopen($new, "w+");
flock($m,LOCK_EX);
fwrite($m,$n);
flock($m,LOCK_UN);
fclose($m);
только если прочитать логику скрипта, то примерно так получается:
читаем about.php
создаем пустой $name.php
блокируем $name.php
открываем $name.php для чтения, читаем, зыкрываем
открываем $name.php для записи, делаем замену в только что прочтенном, записываем
Хотя для админки это лишнее...просто пока это черновой вариант
Спустя 57 секунд (21.03.2010 - 16:25) Guest написал(а):
Игорь_Vasinsky а вот как создавать динамически создоваемые страницы. Можно пример
Спустя 12 секунд (21.03.2010 - 16:25) Игорь_Vasinsky написал(а):
я же написал - там выше... в итоге одна всего физическая страница page.php -а содержимое её в зависимости от того что надо - то и вытаскиваем из строчки таблицы и заполняем страничку... анологично как страницы создаются на этом форуме
а вот и динамическое создание
т.е. от id = 26899
http://phpforum.ru/index.php?showtopic=26899&st=15&#entry357158
а вот и динамическое создание
index.php?showtopic=26899
т.е. от id = 26899
Спустя 1 минута, 38 секунд (21.03.2010 - 16:26) Night User написал(а):
динамические страницы - это да, удобнее, но ТС изначально просил его вариант...
хотя вот уже динамичесие спросил:)
если найду на винте мини-скрипт для дин. страниц - выложу
хотя вот уже динамичесие спросил:)
если найду на винте мини-скрипт для дин. страниц - выложу
Спустя 2 минуты, 13 секунд (21.03.2010 - 16:29) Guest написал(а):
Night User выложи, если найдёшь...я пока сам попробую написать скрипт
Спустя 1 минута, 26 секунд (21.03.2010 - 16:30) Guest написал(а):
Благодаря динамическому созданию страниц будет гораздо меньше места...это уже+, поэтому стоит попробывать
Спустя 2 минуты, 19 секунд (21.03.2010 - 16:32) Игорь_Vasinsky написал(а):
можешь воспользаваться товарищем Гуглом на предмет "Создание динамических страниц PHP и MySQL"
отключаюсь от обсуждения
отключаюсь от обсуждения
Цитата |
но ТС изначально просил его вариант... |
он просто не знал как ещё можно,а я предложил.
Спустя 5 минут, 36 секунд (21.03.2010 - 16:38) Guest написал(а):
Игорь_Vasinsky,Night User спасибо
Спустя 12 минут, 29 секунд (21.03.2010 - 16:51) Night User написал(а):
сначала SQL запрос - создадим базу pages
далее.
админка: добавление или редактирование
add.php - добавить
add.php?page=test - редактировать страницу test
вывод
pages.php - вывод главно - страница index
pages.php?page=test - вывод test
это очень черновой пример, но рабочий:)
CREATE TABLE IF NOT EXISTS `pages` (
`page` varchar(255) NOT NULL,
`title` varchar(255) NOT NULL,
`body` text NOT NULL,
PRIMARY KEY (`page`)
);
далее.
админка: добавление или редактирование
add.php - добавить
add.php?page=test - редактировать страницу test
<?php
$db_host = "localhost"; #хост БД
$db_user = "root"; #пользователь БД
$db_pass = ""; #пароль БД
$db = "db"; # имя БД
$link = mysql_connect($db_host, $db_user, $db_pass); #коннектимся к БД
if (!$link) {
die('Could not connect: ' . mysql_error());
}
if (!mysql_select_db($db)) { #выбираем БД
die('Could not select database: ' . mysql_error());
}
if ($_GET['page']) { #если мы на странице add.php?page=ЧТО-ТО, открываем редактирование страницы
$_GET['page'] = mysql_real_escape_string($_GET['page']); #убираем "опасные" символы
if ($_POST['page'] && $_POST['title'] && $_POST['body']) {
foreach($_POST as $key=>$value) {
$_POST[$key] = mysql_real_escape_string($_POST[$key]); #убираем опасные символы из всего POST массива
}
$query="UPDATE pages SET page = '".$_POST['page']."',
title = '".$_POST['title']."',
body = '".$_POST['body']."' WHERE page = '".$_GET['page']."'";
$result = mysql_query($query); #выполняем запрос в БД - обновление страницы
echo "Success!";
}
$query="SELECT * FROM pages WHERE page = '".$_GET['page']."'"; #получаем содержимое страницы $_GET['page']
$result = mysql_query($query);
$row = mysql_fetch_array($result);
echo '<div align="center">
<form action="add.php?page='.$_GET['page'].'" method="post">
<input type="text" name="page" size="32" value="'.$row['page'].'"><br>
<input type="text" name="title" size="128" value="'.$row['title'].'"><br>
<textarea name="body" id="body" cols="100" rows="20">'.$row['body'].'</textarea>
<br>
<input type="submit" value="Edit">
</form>
</div>'; #выводим в форме редактирования содержимое
} else { # иначе создаем новую страницу ($_GET['page'] пусто)
if ($_POST['page'] && $_POST['title'] && $_POST['body']) {
foreach($_POST as $key=>$value) {
$_POST[$key] = mysql_real_escape_string($_POST[$key]); #см. выше
}
$query="INSERT INTO pages (page, title, body)
VALUES (
'".$_POST['page']."', '".$_POST['title']."', '".$_POST['body']."'
)"; #вставляем в БД новую запись
$result = mysql_query($query);
echo "Success!";
}
echo '<div align="center">
<form action="add.php" method="POST">
<input type="text" name="page" size="32"><br>
<input type="text" name="title" size="128"><br>
<textarea name="body" id="body" cols="100" rows="20"></textarea>
<br>
<input type="submit" value="Add">
</form>
</div>'; #выводим формочку добавления странички
}
?>
вывод
pages.php - вывод главно - страница index
pages.php?page=test - вывод test
<?php
$db_host = "localhost"; #хост БД
$db_user = "root"; #пользователь БД
$db_pass = ""; #пароль БД
$db = "db"; # имя БД
$link = mysql_connect($db_host, $db_user, $db_pass); #коннектимся к БД
if (!$link) {
die('Could not connect: ' . mysql_error());
}
if (!mysql_select_db($db)) {
die('Could not select database: ' . mysql_error());
}
$page = $_GET['page'] ? mysql_real_escape_string($_GET['page']) : 'index'; #удаляем опасные символы
$query="SELECT * FROM pages WHERE page = '".$page."'"; #получаем title и body странички, у которой page = $_GET['page']
$result = mysql_query($query);
$row = mysql_fetch_array($result);
#$row['body']=str_replace("\n", "<br>", $wor['body']); #заменим переход строки на хтмл-тег <br> - раскомментируйте, если надо)
#выводим: $row['title'] - заголовок страницы, $row['body'] - содержимое, $row['page'] - текстовый идентификатор страницы - используем в адресной строке
echo '<h1>'.$row['title'].'</h1>
<p>'.$row['body'].'</p>';
?>
это очень черновой пример, но рабочий:)
Спустя 9 минут, 9 секунд (21.03.2010 - 17:00) Игорь_Vasinsky написал(а):
ну хотяб комментыв раставил. чтоб понятно было, человек первый раз с таким алгоритмом втречается.
Цитата |
надо еще защитить скрипт от SQL - инъекций |
если админка по него , то можно пропустить.
Спустя 3 минуты, 15 секунд (21.03.2010 - 17:03) Night User написал(а):
ща расставлю... кстати, пофиксил скьюл-инъекцию
расставил комментарии, если что непонятно будет - спрашивайте
расставил комментарии, если что непонятно будет - спрашивайте
Спустя 41 минута, 50 секунд (21.03.2010 - 17:45) twin написал(а):
Цитата |
это очень черновой пример, но рабочий:) |
вот это самое печальное... что рабочий. Лучше бы не работал.
Потому что самое страшное, не когда программа не работает, а когда она работает почти всегда.
При чем чем тоньше это почти - тем хуже ситуация, так как тем сложнее отловить причину, по которой она не работает во всех ситуациях.
Программа, которая не подчиняется её автору (пусть даже крайне редко) может быть применена другим человеком, который сможет подчинить её уже своим целям. И вот тогда, случается, что законный хозяин программы приходит к выводу, что лучше бы он с этой программой не имел дела вообще.
Именно поэтому, плохо работающая программа хуже программы не работающей в принципе.
Спустя 8 минут (21.03.2010 - 17:53) Night User написал(а):
Для базового понимания вполне достаточно. На рабочем сайте крайне не рекомендую использовать.
Кстати, необхдимо заметить, что ТС выше писал
Кстати, необхдимо заметить, что ТС выше писал
Цитата |
я пока сам попробую написать скрипт |
и
Цитата |
а вот как создавать динамически создоваемые страницы. Можно пример |
Это просто пример использования
P.S. есть ощущение, что пишу Disclaimer
Спустя 45 минут, 3 секунды (21.03.2010 - 18:38) twin написал(а):
Night User, Игорь_Vasinsky
Вы тока, ребят, не обижайтесь. Скажете щас - опять этот брюзга приперся.
Просто не могу смотреть спокойно, как сами делаете что попало, и других еще учите.
Если нужен пример, как работают динамические страницы, то и нужно это показать. А не писать полсайта для примера. Ведь кто то увидит и обрадуется.
Вот для начала:
Это содержит полезной информации не меньше, хотя проще на порядок. Тут и логика, и разделение, и начало безопасности. Вот отсюда нужно постепенно развивать события. Потому что навскидку уже несколько тактических и одну стратегическую ошибку вижу.
Вы тока, ребят, не обижайтесь. Скажете щас - опять этот брюзга приперся.
Просто не могу смотреть спокойно, как сами делаете что попало, и других еще учите.
Если нужен пример, как работают динамические страницы, то и нужно это показать. А не писать полсайта для примера. Ведь кто то увидит и обрадуется.
Вот для начала:
<?php
$id = !empty($_GET['id'])?(int)$_GET['id']:1;
$content = array(
'404 (ничего нет)',
'Я - первая страница',
'Я - вторая страница',
'Я - третья страница',
);
?>
<html>
<body>
<h1><?php echo $content[$id]; ?> </h1>
<a href="?id=1">первая страница</a><br />
<a href="?id=2">вторая страница</a><br />
<a href="?id=3">третья страница</a><br />
</body>
</html>
Это содержит полезной информации не меньше, хотя проще на порядок. Тут и логика, и разделение, и начало безопасности. Вот отсюда нужно постепенно развивать события. Потому что навскидку уже несколько тактических и одну стратегическую ошибку вижу.
Спустя 9 минут, 47 секунд (21.03.2010 - 18:48) Night User написал(а):
Да, соглашусь, не учел, что ТС (не в обиду) АБСОЛЮТНО не понимает логику динамических страниц
Просто для меня было бы достаточно такого объяснения (когда я был на уровне ТС):
Просто для меня было бы достаточно такого объяснения (когда я был на уровне ТС):
Цитата |
я же написал - там выше... в итоге одна всего физическая страница page.php -а содержимое её в зависимости от того что надо - то и вытаскиваем из строчки таблицы и заполняем страничку... анологично как страницы создаются на этом форумеhttp://phpforum.ru/index.php?showtopic=26899&st=15&#entry357158 а вот и динамическое создание index.php?showtopic=26899 т.е. от id = 26899 |
2twin, ну не умею я еще учить других юзеров, учусь только
P.S. учусь учить - тафтология какая то...
Спустя 3 минуты, 47 секунд (21.03.2010 - 18:51) Игорь_Vasinsky написал(а):
Справедливо.
Сейчас набрасаю пример
Сейчас набрасаю пример
Спустя 1 час, 13 минут, 21 секунда (21.03.2010 - 20:05) Игорь_Vasinsky написал(а):
Итак, цель : Написать форму, код обработчик и организация вывода динамических страниц.
Пояснения: Предпологается, что доступ к этому разделу открыт для администратора сайта, само собой владеющего знаниями HTML, так же допускается использывание PHP (например: голосование, комментарии и.д.)
1. Пример формы через которую создаются "страницы":
листинг index.php
!!! Предпологается, что автор новых страниц владеет знаниями html
2. Код обработчик формы:
Дамg SQL
//могу ошибиться - не серчайте
листинг add_page.php
3. Организация вывода всех страниц:
листинг all_pages.php
(отдельно -> можно подключить через include, типа "Список статей")
4. Формирование и вызов нужной страницы
листинг page.php
так же но в обратном порядке можно организовать редактирование страниц
вот и всё, мож где чё напута... нет возможности протестировать.
Пояснения: Предпологается, что доступ к этому разделу открыт для администратора сайта, само собой владеющего знаниями HTML, так же допускается использывание PHP (например: голосование, комментарии и.д.)
1. Пример формы через которую создаются "страницы":
листинг index.php
<form method='POST' action='add_page.php'>
наименование страницы (title)<br>
<input type='text' name='name_page' size='100'><br><br>
исходный код страницы<br>
<textarea name='code_page' cols='100' rows='30'>
<html>
<head>
<title>Наименование новой страницы</title>
....
META теги, подключение стиля CSS, JS
....
</head>
<body>
здесь уже может быть забито, например шапка, меню, счётчики и т.д
HTML & PHP коде
</body>
</html>
</tetxarea>
</form>
!!! Предпологается, что автор новых страниц владеет знаниями html
2. Код обработчик формы:
Дамg SQL
//могу ошибиться - не серчайте
create table `my_new_pages`(
id int auto_increment,
name_page varchar(60) not null,
code_page FULLTEXT not null,
primary_key(id)
);
листинг add_page.php
<?php
//Началор кода поключения
// (можно вынести в config.php и подключать через include)
// подключение к БД, заменить на свои
define("HOST", "localhost"); // сервер БД
define("USER", "root"); // имя пользователя
define("PASSWORD", ""); // пароль
define("DB", "dinamic_pages"); // база данных
// подключение к бд и если что выводим ошибку
$link = mysql_connect(HOST, USER, PASSWORD) or die('Could not connect: ' . mysql_error());
// выбор базы
mysql_select_db(DB, $link)) or die('Could not select database: ' . mysql_error());
// окончание кода подключения
// принемаем данные из формы, т.к. раздел имеет административный доступ,
// пропускаем все данные, учитывая о недопустимости использывания " '
// " (одинарных ковычек), мускул будет ругаться
// заголовок страницы
$name = mysql_real_escape_string($_POST['name_page']);
// контент новой страницы
$code_page = mysql_real_escape_string($_POST['code_page']);
// Записываем в базу полученные данные, опять же напомню - что данный
// пример организует полный доступ к исходному коду новой страницы
$sql = "INSERT INTO `my_new_pages` (page_name, code_page) VALUES ('".$page_name."', '".$code_page."')";
mysql_query($sql) or die (mysql_error());
// ошибку выводим, если вдруг вы допустили один. ковычку - mysql - конечно
// не сможет записать данный
// Теперь у нас есть "новая страничка" в базе
mysql_close();
?>
3. Организация вывода всех страниц:
листинг all_pages.php
(отдельно -> можно подключить через include, типа "Список статей")
<?php
// поключение к базе
$sql = "SELECT * FROM `my_new_pages`";
$result = mysql_query($sql) or die (mysql_error());
// Получим все наименования (title) имеющихся страниц
// форматирование списка буду делать через <br>
while ($my_page = mysql_fetch_assoc($result))
{
echo $my_page['id']"."<a href='page.php?id=".$my_page['id']."'>".$my_page['name_page']."</a>";
}
mysql_close();
?>
4. Формирование и вызов нужной страницы
листинг page.php
<?php
//......подключение к базе
// как ты заметил - формирование ссылок для страниц имеет такой вид:
// page.php?id=21 - передаётся методом GET,
// где id - id страницы (он уникален для каждой страницы)
$id = $GET['id'];
$sql = "SELECT * FROM `my_new_pages` WHERE `id` = '".$id."'";
$result = mysql_query($sql);
while ($page = mysql_fetch_assoc($result))
{
echo stripslashes($page['code_page']);
// stripslashes() использовали чтобы убрать экранировку при использрвании
// mysql_real_escape_string на вводе
}
?>
так же но в обратном порядке можно организовать редактирование страниц
вот и всё, мож где чё напута... нет возможности протестировать.
Спустя 10 минут, 36 секунд (21.03.2010 - 20:15) Игорь_Vasinsky написал(а):
если прокатит, добавлю к себе в журнал.
Спустя 5 минут, 36 секунд (21.03.2010 - 20:21) Night User написал(а):
... эту строчки в page.php:
НЕОБХОДИМО заменить на что-нибудь типа этого:
код пока не читал - то, что сразу в глаза бросилось
$id = $GET['id'];
НЕОБХОДИМО заменить на что-нибудь типа этого:
$id = (int)$GET['id'];
код пока не читал - то, что сразу в глаза бросилось
Спустя 11 минут, 25 секунд (21.03.2010 - 20:32) Игорь_Vasinsky написал(а):
ну да, естесственно, я не учёл. спасиб, ещё недочёты есть ?
Для автора темы
Для автора темы
Цитата |
$id = (int)$GET['id']; |
этой строчкой мы обезапасим себя от хулюганов т.к. id у нас может быть только целым цислом (integer)... так как в адресной строке в id - можно будет записать что угодно и получить доступ к закрытым вещам.
ещё не плохо бы подсчитывать строчки в базе и делать условие:
if ($id < 0)
{
пользыватель хочет статью с отрицательным id
}
elseif ($id > $num_rows)
// $num_rows - количество статей, только учти при удалении строчки из БД
// последний id - не будет соответствовать общему кол-во строчек
{
пользыватель хочет статью с id которого пока ещё нет
}
Спустя 19 минут, 9 секунд (21.03.2010 - 20:51) Night User написал(а):
all_pages.php - коммент не там поставлен:
add_page.php - опсно все-таки... и еще точек с запятой нет:
лучше:
еще подключение к БД не оформлено. что-то типа такого лучше:
короче обработчик ошибок к select db
// поключение к базе
<?php
add_page.php - опсно все-таки... и еще точек с запятой нет:
$name = $_POST['name_page'] // заголовок страницы
$code_page = $_POST['code_page'] // контент новой страницы
// Записываем в базу полученные данные, опять же напомню - что данный
// пример организует полный доступ к исходному коду новой страницы
$sql = "INSERT INTO `my_new_pages` (page_name, code_page) VALUES ('".$page_name."', '".$code_page."')";
лучше:
$name = mysql_real_escape_string($_POST['name_page']); // заголовок страницы
$code_page = mysql_real_escape_string($_POST['code_page']); // контент новой страницы
// Записываем в базу полученные данные, опять же напомню - что данный
// пример организует полный доступ к исходному коду новой страницы
$sql = "INSERT INTO `my_new_pages` (page_name, code_page) VALUES ('".$page_name."', '".$code_page."')";
еще подключение к БД не оформлено. что-то типа такого лучше:
$link = mysql_connect($db_host, $db_user, $db_pass); #коннектимся к БД
if (!$link) {
die('Could not connect: ' . mysql_error());
}
if (!mysql_select_db($db)) {
die('Could not select database: ' . mysql_error());
}
короче обработчик ошибок к select db
Спустя 12 минут, 7 секунд (21.03.2010 - 21:04) Игорь_Vasinsky написал(а):
Night User изменения и поправки внёс...
хотя я делал акцент на то что доступ к разделу открыт для админа и он владеет html., ну лан..делать так делать.
тока у меня данные для коннекта были определены как константы,.. я изменил, спасиб.
теперь нужно чтоб гость про тестил.
хотя я делал акцент на то что доступ к разделу открыт для админа и он владеет html., ну лан..делать так делать.
тока у меня данные для коннекта были определены как константы,.. я изменил, спасиб.
теперь нужно чтоб гость про тестил.
Спустя 4 минуты, 54 секунды (21.03.2010 - 21:09) Night User написал(а):
ага, пускай тестит.
константы - не поправил просто
знания html, конечно, может и есть, однако, ошибаются все и вдруг кто забудет
константы - не поправил просто
знания html, конечно, может и есть, однако, ошибаются все и вдруг кто забудет
Спустя 32 минуты, 39 секунд (21.03.2010 - 21:41) twin написал(а):
Теперь два момента.
Первой строчкой скрипта поставьте это:
и посмотрите что будет.
И второй. Вот это
лучше делать так:
Потому что это читабельнее и проще убирается в боевом исполнении.
Ну и самое главное. Магические кавычки. Поройтесь, полезно будет.
Первой строчкой скрипта поставьте это:
error_reporting(E_ALL);
и посмотрите что будет.
И второй. Вот это
$link = mysql_connect($db_host, $db_user, $db_pass); #коннектимся к БД
if (!$link) {
die('Could not connect: ' . mysql_error());
}
лучше делать так:
$link = mysql_connect($db_host, $db_user, $db_pass) or die('Could not connect: ' . mysql_error());
Потому что это читабельнее и проще убирается в боевом исполнении.
Ну и самое главное. Магические кавычки. Поройтесь, полезно будет.
Спустя 4 минуты, 49 секунд (21.03.2010 - 21:46) Night User написал(а):
Насчет коннекта к БД - ступил, сорри. Сам обычно использую предложенный twin'ом вариант
Magic quotes - stripslashes(), нэ?
Magic quotes - stripslashes(), нэ?
Спустя 16 минут, 25 секунд (21.03.2010 - 22:02) Игорь_Vasinsky написал(а):
Night User протести пожалуста у меня возможности не т, скрипт без отладки выложил.... а результат ошибок здесь размести
Спустя 8 минут, 37 секунд (21.03.2010 - 22:11) Игорь_Vasinsky написал(а):
mysql_real_escape_string - да, мы же через них в БД записовали,
значит при выводе - надо сделать stripslashes();
значит при выводе - надо сделать stripslashes();
Спустя 22 минуты, 37 секунд (21.03.2010 - 22:34) Игорь_Vasinsky написал(а):
Получается что сначала нужно проверить - включены ли "волшебные ковычки" или нет.
а включаются они в php.ini - стало быть на онлайн хостинге управлять ими нет возможности у нас стало быть:
1. проверить, добавил ли PHP, можно с помощью функции get_magic_quotes_gpc, если да то удалять их на выводе stripslashes(),
и тогда по сути mysql_real_escape_string - нам не нужна, т.к. ' уже будут экранированы и получиться путаница
а если ковычки не включены - то используем для ввода в базу данных через mysql_real_escape_string
Так ?
а включаются они в php.ini - стало быть на онлайн хостинге управлять ими нет возможности у нас стало быть:
1. проверить, добавил ли PHP, можно с помощью функции get_magic_quotes_gpc, если да то удалять их на выводе stripslashes(),
и тогда по сути mysql_real_escape_string - нам не нужна, т.к. ' уже будут экранированы и получиться путаница
а если ковычки не включены - то используем для ввода в базу данных через mysql_real_escape_string
Так ?
Спустя 1 час, 15 минут, 26 секунд (21.03.2010 - 23:49) twin написал(а):
Не совсем. Начал хорошо,
Цитата |
1. проверить, добавил ли PHP, можно с помощью функции get_magic_quotes_gpc, если да то удалять их на выводе stripslashes(), |
потом потерялся.
Цитата |
и тогда по сути mysql_real_escape_string - нам не нужна, т.к. ' уже будут экранированы и получиться путаница |
Если ты разденешь на входе данные stripslashes(), то почему это не нужна?
Спустя 32 минуты (22.03.2010 - 00:21) Игорь_Vasinsky написал(а):
я предположил что сначала PHP (волшебные ковычки включены) то одинарные ковычки уже будут экранироваться т.е. \'
а если ещё в запросе к БД делать mysql_real_escape_string, то разве неполучиться что \\'
либо на ваш намёк смотря - этого не произайдёт ?
пытаюсь понять...
я бы не спросил, еслиб был бы за своим компом - протестировал и увидел бы результат......
а если ещё в запросе к БД делать mysql_real_escape_string, то разве неполучиться что \\'
либо на ваш намёк смотря - этого не произайдёт ?
пытаюсь понять...
я бы не спросил, еслиб был бы за своим компом - протестировал и увидел бы результат......
Спустя 15 минут, 32 секунды (22.03.2010 - 00:37) twin написал(а):
Все дело в том, что это аттавизм. И в последующих версиях php никаких магических кавычек уже не будет. А значит нужно просто напросто избавится от них на входе и работать дальше так, как будто их никогда небыло.
Начал ты верно. Если директива включена, значит нужно убрать то, что она успела нагадить. А потом обрабатывать нормальной функцией. Тогда скрипт не будет зависеть от директивы ни сейчас, ни потом, когда её полностью исключат.
Начал ты верно. Если директива включена, значит нужно убрать то, что она успела нагадить. А потом обрабатывать нормальной функцией. Тогда скрипт не будет зависеть от директивы ни сейчас, ни потом, когда её полностью исключат.
Спустя 9 минут, 31 секунда (22.03.2010 - 00:46) Игорь_Vasinsky написал(а):
а.... спасибо. теперь блин дошло...
..возьму за правило.
..возьму за правило.
Спустя 10 часов, 20 минут, 48 секунд (22.03.2010 - 11:07) Guest написал(а):
Спасибо всем, вчера вышел, погулял по набережной, пришёл домой я минут за 5 все ошибки нашёл (реализовал то, что я хотел, только первоначальным способом). Night User спасибо за пример, хотя код был понятен и без комментов. Логику создания динамических страниц я не не понимал, а не знал (не понимает - это, когда прочёл и ничего не понял, а я и не знал). Щас прочёл...особо напрягать мозг не пришлось, чтобы разобраться. Twin, спасибо за пример только с точки зрения безопасности не безопасно выводить сообщения об ошибках ($link = mysql_connect($db_host, $db_user, $db_pass); #коннектимся к БД
if (!$link) {
die('Could not connect: ' . mysql_error());
})...кому-то они будут очень полезны . Лучше (я так думаю) их выводить для себя, когда пишешь. И проверять переменные я привык не всё-таки регулярными выражениями. Так и sql инъекция не страшна.
if (!$link) {
die('Could not connect: ' . mysql_error());
})...кому-то они будут очень полезны . Лучше (я так думаю) их выводить для себя, когда пишешь. И проверять переменные я привык не всё-таки регулярными выражениями. Так и sql инъекция не страшна.
Спустя 4 часа, 17 минут, 30 секунд (22.03.2010 - 15:24) Игорь_Vasinsky написал(а):
Игорю спасибо за весь код...тра та та
Спустя 1 день, 19 часов, 21 минута, 56 секунд (24.03.2010 - 10:46) Guest написал(а):
Игорь, тебе отдельное спасибо за проделанную работу