Как изменить html через php

Problem I'm trying to edit HTML/PHP files server side with PHP. With AJAX Post I send three different values to the server: the url of the page that needs to be edited the id of the element that ...

Problem

I’m trying to edit HTML/PHP files server side with PHP. With AJAX Post I send three different values to the server:

  • the url of the page that needs to be edited
  • the id of the element that needs to be edited
  • the new content for the element

The PHP file I have now looks like this:

<?php
    $data = json_decode(stripslashes($_POST['data']));
    $count = 0;
    foreach ($data as $i => $array) {
        if (!is_array($array) && $count == 0){
            $count = 1;
            // $array = file url
        }
        elseif (is_array($array)) {
            foreach($array as $i => $content){
                // $array[0] = id's
                // $array[1] = contents
            }
        }
    }
?>

As you can see I wrapped the variables in an array so it’s possible to edit multiple elements at a time.
I’ve been looking for a solution for hours but can’t make up my mind and tell what’s the best/possible solution.

Solution

I tried creating a new DOMElement and load in the html, but when dealing with a PHP file, this solution isn’t possible since it can’t save php files:

$html = new DOMDocument(); 
$html->loadHTMLFile('file.php'); 
$html->getElementById('myId')->nodeValue = 'New value';
$html->saveHTMLFile("foo.html");

(From this answer)

Opening a file, writing in it and saving it comes is another way to do this. But I guess I must be using str_replace or preg_replace this way.

$fname = "demo.txt";
$fhandle = fopen($fname,"r");
$content = fread($fhandle,filesize($fname));

$content = str_replace("oldword", "newword", $content);

$fhandle = fopen($fname,"w");
fwrite($fhandle,$content);
fclose($fhandle);

(From this page)

I read everywhere that str_replace and preg_replace are risky ‘caus I’m trying to edit all kinds of DOM elements, and not a specific string/element. I guess the code below comes close to what I’m trying to achieve but I can’t really trust it..

$replace_with = 'id="myID">' . $replacement_content . '</';
if ($updated = preg_replace('#id="myID">.*?</#Umsi', $replace_with, $file)) {   
    // write the contents of $file back to index.php, and then refresh the page.
    file_put_contents('file.php', $updated);
}

(From this answer)

Question

In short: what is the best solution, or is it even possible to edit HTML elements content in different file types with only an id provided?

Wished steps:

  • get file from url

  • find element with id

  • replace it’s content

171 / 169 / 1

Регистрация: 22.08.2010

Сообщений: 1,251

1

05.02.2011, 21:08. Показов 7583. Ответов 20


Есть html код который в ручную редактировать не удобно. Хочу сделать этот процесс более удобным.
Как с помощью php можно сделать страничку в которой можно будет ввести описание чего либо, прикрепить изображение и нажав на кнопку отправить, это описание и изображение добавлялось к главной странице после тега <body>?



0



26 / 18 / 1

Регистрация: 05.02.2011

Сообщений: 55

05.02.2011, 21:44

2

Надо полностью заменить код между тегами <body></body> или просто к существующему коду добавить сверху ?

Покажите html-шаблон того что надо добавить.
И вообще поподробнее бы рассказали.



1



OVSite

171 / 169 / 1

Регистрация: 22.08.2010

Сообщений: 1,251

05.02.2011, 21:48

 [ТС]

3

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
    <head>
</head>
    <body>
    <div id="Site">
    <div id="Heading">
    </div>
    <div id="Menu">
    <?php
    include ("Menu.html");
    ?>
    </div>
    <div id="Programma">
    </div>
    </div>
    </body>
</html>

Нужно что бы в блок <div id=»Programma»></div> добавлялось.



0



26 / 18 / 1

Регистрация: 05.02.2011

Сообщений: 55

05.02.2011, 21:59

4

Я понял Вас так.

Надо сделать форму с полем ввода текста, полем выбора фотки на компе, и кнопочки отправки формы.
Ресайз изображения делать не надо и проверять на то что это действительно изображение тоже не надо так как Вы лично будите этим пользоваться.
Скопировать изображение в определенную папку.
Составить что то типа:

<img src=»наше изображение»>
<div id=»text»>наш текст</div>

и вставить это между <div id=»Programma»></div>

Так?



1



171 / 169 / 1

Регистрация: 22.08.2010

Сообщений: 1,251

05.02.2011, 22:02

 [ТС]

5

Цитата
Сообщение от evgentus
Посмотреть сообщение

Я понял Вас так.
Надо сделать форму с полем ввода текста, полем выбора фотки на компе, и кнопочки отправки формы.
Ресайз изображения делать не надо и проверять на то что это действительно изображение тоже не надо так как Вы лично будите этим пользоваться.
Скопировать изображение в определенную папку.
Составить что то типа:
<img src=»наше изображение»>
<div id=»text»>наш текст</div>
и вставить это между <div id=»Programma»></div>
Так?

Почти.

Цитата
Сообщение от evgentus
Посмотреть сообщение

<div id=»text»>наш текст</div>

Просто текст без тегов.



0



evgentus

26 / 18 / 1

Регистрация: 05.02.2011

Сообщений: 55

05.02.2011, 22:46

6

Если все правильно понял то вот.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
define("FILE", 'index.html');
define("UPLOAD_FOLDER", 'upload/');
$text = '<html>
        <head>
</head>
        <body>
        <div id="Site">
        <div id="Heading">
        </div>
        <div id="Menu">
        <?php
        include ("Menu.html");
        ?>
        </div>
        <div id="Programma">
        ';
$_text = '</div>
        </div>
        </body>
</html>';
 
function uploadImage($file, $name)
{
    $urlImage = UPLOAD_FOLDER . $name;
    return (move_uploaded_file($file, $urlImage))?$urlImage:false;
}
 
if (isset($_POST['upload'])){
    if ($img = uploadImage($_FILES['image']['tmp_name'], $_FILES['image']['name'])){
        $image = '<img src="'.$img.'"><br />';
        $text = $text . $image . $_POST['text'] . $_text;
        echo (file_put_contents(FILE, $text))?'Всё ОК!':"Всё хреново:(";
    }
    else{
        echo "Error!";
    }
}
else{
    echo "<form enctype="multipart/form-data" action="add.php" method="post">
    Введите текст<br />
    <textarea name="text" cols=30 rows=5></textarea><br />
    Выберите картинку<br />
    <input type="file" name="image"><br />
    <input type="submit" name="upload" value="Закачать">
    </form>";
}
?>



1



171 / 169 / 1

Регистрация: 22.08.2010

Сообщений: 1,251

05.02.2011, 22:55

 [ТС]

7

А куда здесь сохраняется изображение?



0



evgentus

26 / 18 / 1

Регистрация: 05.02.2011

Сообщений: 55

05.02.2011, 23:02

8

скрипт в файл add.php, и в этой папке где add.php создаешь папку upload (или другую, ее название в UPLOAD_FOLDER в начале скрипта) в ней и будут картинки.
Написано на скоряк, нет проверок различных, имя файла лучше генерировать по другому а не использовать $_FILE[‘image’][‘name’] а сделать допустим так,

PHP
1
$filename = md5($_FILE['image']['name']. microtime()) . 'расширение';

Ну от этого базового скрипта можете оттолкнуться, и дописать как Вам удобно, возможно я просто не понял что Вам нужно…



1



OVSite

171 / 169 / 1

Регистрация: 22.08.2010

Сообщений: 1,251

05.02.2011, 23:37

 [ТС]

9

Вот что выдал
Warning: move_uploaded_file(,image/COMODO.png): failed to open stream: No such file or directory in /home/o/ovsite.h18.ru/WWW/Editor.php on line 26

Warning: move_uploaded_file(): Unable to move ‘/var/tmp/phpNv7awk’ to ‘,image/COMODO.png’ in /home/o/ovsite.h18.ru/WWW/Editor.php on line 26
Error!
Может я что не правильно сделал
Вот файл html

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<html>
    <head>
    <title>Редактирование</title>
    <link rel="stylesheet" type="text/css" href="index.css">
    </head>
    <body>
    <div id="Site">
    <div id="Heading">
    </div>
    <div id="Menu">
    </div>
    <div id="Programma">
    <form enctype="multipart/form-data" action="Editor.php" method="post">
        Изображение<br />
        <input type="file" name="image"><br />
        <input type="submit" name="upload" value="Добавить">
        Описание<br />
        <textarea name="text" cols=30 rows=5></textarea><br />
        </form>
    </div>
    </div>
    </body>
</html>

Вот файл обработчик

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
define("FILE", 'index.html');
define("UPLOAD_FOLDER", ',image/');
$text = '<html>
        <head>
</head>
        <body>
        <div id="Site">
        <div id="Heading">
        </div>
        <div id="Menu">
        <?php
        include ("Menu.html");
        ?>
        </div>
        <div id="Programma">
        ';
$_text = '</div>
        </div>
        </body>
</html>';
 
function uploadImage($file, $name)
{
        $urlImage = UPLOAD_FOLDER . $name;
        return (move_uploaded_file($file, $urlImage))?$urlImage:false;
}
 
if (isset($_POST['upload'])){
        if ($img = uploadImage($_FILES['image']['tmp_name'], $_FILES['image']['name'])){
                $image = '<img src="'.$img.'"><br />';
                $text = $text . $image . $_POST['text'] . $_text;
                echo (file_put_contents(FILE, $text))?'Всё ОК!':"Всё хреново:(";
        }
        else{
                echo "Error!";
        }
}
else{
}

Добавлено через 6 минут
Нашёл ошибку, исправил, но возникла другая проблема.
После загрузки изображений и описания после нажимая на кнопку выдаёт просто белую страницу, а в файле index нечего не меняется.

Добавлено через 17 минут
Понял.
Нужно твой код добавить в index.php?

Добавлено через 1 минуту
А я сделал два отдельных файла Editor.php и Editor.html.



0



26 / 18 / 1

Регистрация: 05.02.2011

Сообщений: 55

05.02.2011, 23:41

10

Индексный файл точно так называется и имеет такое же расширение как в константе?
define(«FILE», ‘index.html’);
Потому что перед тем как Вам отправлять, проверил, у меня все работает!

ПС. Попробуйте в else{

}
добавить print_r($_POST);

если что то напечатает вместо белого экрана, напишите.



1



171 / 169 / 1

Регистрация: 22.08.2010

Сообщений: 1,251

05.02.2011, 23:42

 [ТС]

11

Цитата
Сообщение от evgentus
Посмотреть сообщение

define(«FILE», ‘index.html’);

Изменил на index.php.



0



26 / 18 / 1

Регистрация: 05.02.2011

Сообщений: 55

05.02.2011, 23:43

12

Да можно и отдельные файлы, можно и один, разницы то нет… Но в одном как то компактнее.
Просто надо записать мой код в файл add.php и поменять там константы если нужно.



1



171 / 169 / 1

Регистрация: 22.08.2010

Сообщений: 1,251

05.02.2011, 23:45

 [ТС]

13

Белый экран.
Можете сами проверить http://ovsite.h18.ru/Editor.html.

Добавлено через 42 секунды

Цитата
Сообщение от evgentus
Посмотреть сообщение

Просто надо записать мой код в файл add.php и поменять там константы если нужно.

Я изменил название с add.php на Editor.php и в коде это тоже изменил.



0



26 / 18 / 1

Регистрация: 05.02.2011

Сообщений: 55

06.02.2011, 00:02

14

У папки с картинками должны быть права на запись, у index.php аналогично.
И еще…

Надо переделать скрипт, а то он перезапишет все Ваши предыдущие данные в index.php

Надо будет читать index.php в переменную, допустим $fullFile = file_get_contents(FILE);
Регулярками или еще чем нибудь разделить текст так, чтобы в переменной $text было то что идет до <div id=»Programma»> (вместе с этой строчкой) , а в переменной $_text все что после.

Я в регулярках не спец, поищите в инете как это сделать…
А вообще, юзайте БД, все намного проще будет!



1



171 / 169 / 1

Регистрация: 22.08.2010

Сообщений: 1,251

06.02.2011, 00:06

 [ТС]

15

Цитата
Сообщение от evgentus
Посмотреть сообщение

У папки с картинками должны быть права на запись, у index.php аналогично.

Проверял, в папке изображения появляются.
Как изменить права?

Цитата
Сообщение от evgentus
Посмотреть сообщение

Надо будет читать index.php в переменную, допустим $fullFile = file_get_contents(FILE);

Можно по подробнее и с кодом?



0



evgentus

26 / 18 / 1

Регистрация: 05.02.2011

Сообщений: 55

06.02.2011, 00:43

16

Нужно просто создать файл Editor.php и залить в него всё что написано ниже.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
define("FILE", 'index.php');
define("UPLOAD_FOLDER", 'image/');
$fulFile = file_get_contents(FILE);
$text = '<div id="Programma">';
 
function uploadImage($file, $name)
{
    $urlImage = UPLOAD_FOLDER . $name;
    return (move_uploaded_file($file, $urlImage))?$urlImage:false;
}
 
if (isset($_POST['upload'])){
    if ($img = uploadImage($_FILES['image']['tmp_name'], $_FILES['image']['name'])){
        echo "Изображение загружено <br />";
        $image = '<img src="'.$img.'"><br />';
        $_text = $text . $image . $_POST['text'];
        echo (file_put_contents(FILE, str_replace($text, $_text, $fulFile)))?'Всё ОК!':"Всё хреново:(";
    }
    else{
        echo "Error!";
    }
}
else{
    echo "<form enctype="multipart/form-data" action="Editor.php" method="post">
    Введите текст<br />
    <textarea name="text" cols=30 rows=5></textarea><br />
    Выберите картинку<br />
    <input type="file" name="image"><br />
    <input type="submit" name="upload" value="Закачать">
    </form>";
}
?>



1



171 / 169 / 1

Регистрация: 22.08.2010

Сообщений: 1,251

06.02.2011, 13:51

 [ТС]

17

Этот код тоже не работает.



0



26 / 18 / 1

Регистрация: 05.02.2011

Сообщений: 55

06.02.2011, 13:57

18

У меня он работает без проблем, копайте в сторону прав доступа на файл index.php и папку image
Должна быть разрешена запись в них.
Какие именно права выставлять — у хостера должна быть инфа по этому поводу.



0



171 / 169 / 1

Регистрация: 22.08.2010

Сообщений: 1,251

06.02.2011, 14:02

 [ТС]

19

Цитата
Сообщение от evgentus
Посмотреть сообщение

У меня он работает без проблем, копайте в сторону прав доступа на файл index.php и папку image
Должна быть разрешена запись в них.
Какие именно права выставлять — у хостера должна быть инфа по этому поводу.

Какие права выставлять я знаю, а вот как их выставлять это проблема.



0



26 / 18 / 1

Регистрация: 05.02.2011

Сообщений: 55

06.02.2011, 14:10

20

Через Total Commander на ftp надо зайти и выбрать «change attributes»(помоему так называется)…
Можно через php … Функция chmod();



0



За последние 24 часа нас посетили 11527 программистов и 1181 робот. Сейчас ищут 235 программистов …


  1. Денис9999

    С нами с:
    28 окт 2015
    Сообщения:
    5
    Симпатии:
    0

    Прошу помощи!
    переменная содержит код html, необходимо сделать найти и заменить часть кода(«<span style=»color:#A9A9A9″><strong>&lt;Фирма&gt;</strong></span>»), на другое значение.
    сделать это функцией str_replace() не получается, так же strpos() тоже не находит


  2. denis01

    Команда форума
    Модератор

    1. $str = ‘<div><span style=»color:#A9A9A9″><strong><Фирма></strong></span></div>’;
    2. $r= str_replace(‘<span style=»color:#A9A9A9″><strong><Фирма></strong></span>’, ‘<p>hello</p>’, $str);


  3. Денис9999

    С нами с:
    28 окт 2015
    Сообщения:
    5
    Симпатии:
    0

    да, так все получается, но я значение «<span style=»color:#A9A9A9″><strong>&lt;Фирма&gt;</strong></span>» беру из базы, и
    str_replace( $data[0] , ‘<p>hello</p>’, $str)- уже не срабатывает

    1.     [0] => <span style=»color:#A9A9A9″><strong>&lt;Фирма&gt;</strong></span>
    2.     [1] => <span style=»color:#A9A9A9″><strong>&lt;ВидДеятельности&gt;</strong></span>


  4. Денис9999

    С нами с:
    28 окт 2015
    Сообщения:
    5
    Симпатии:
    0

    нужно «…фирма…» на <p>hello1</p>, а «…ВидДеятельности…» на <p>hello2</p>

    но $data[0] = ‘<span style=»color:#A9A9A9″><strong>&lt;Фирма&gt;</strong></span>’ и в данном случае
    str_replace($data[0] ,'<p>hello1</p>’, $str)
    , почему то не заменяется

    а при прямом подставлении
    str_replace(‘<span style=»color:#A9A9A9″><strong>&lt;Фирма&gt;</strong></span>’ ,'<p>hello1</p>’, $str)
    замена происходит


  5. VLK

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58

    так наверное для начала дубиноголовый надо было сказать что значение в теге меняется.

    это все сюрпризы или еще будут?

    1. $str = ‘<div><span style=»color:#A9A9A9″><strong><Фирма></strong></span></div>’;
    2. $before = ‘<span style=»color:#A9A9A9″><strong>’;
    3. $after = ‘</strong></span>’;


  6. Денис9999

    С нами с:
    28 окт 2015
    Сообщения:
    5
    Симпатии:
    0

    читай внимательней, ответ не в тему

    я не меняю значение в тегах!!!!
    я меняю в строке с тегами и значениями, определенный кусок с тегами и значениями, на другой кусок с тегами и значениями!
    это ‘<span style=»color:#A9A9A9″><strong>&lt;Фирма&gt;</strong></span>’ на ‘<p>hello1</p>’ в строке $str


  7. denis01

    Команда форума
    Модератор

    У меня всё работает и с массивом, возможно дело в другом, может кодировка не совпадает или не видим всей картины

    1. header(‘Content-Type: text/html; charset=utf-8’);
    2.     ‘<span style=»color:#A9A9A9″><strong><Фирма></strong></span>’,
    3.     ‘<span style=»color:#A9A9A9″><strong><ВидДеятельности></strong></span>’,
    4. $str = ‘<div><span style=»color:#A9A9A9″><strong><Фирма></strong></span></div>’;


  8. Денис9999

    С нами с:
    28 окт 2015
    Сообщения:
    5
    Симпатии:
    0

    да, похоже дело в кодировке, видимо из базы значение приходят такие
    Спасибо!

Данный вопрос возникает при верстке писем т.к. стили прописанные в <head> в почтовых сервисах и программах не работают, а в ручную прописывать стили каждому тегу вручную долго и не удобно. Далее представлены варианты как автоматизировать этот процесс.

Пример HTML кода в котором нужно добавить стили.

$html = '
	<p>Текст <span>1</span></p>
	<p style="text-align: center">Текст 2</p>
	<img src="/uploads/logo.png">
';

PHP

Массив тегов и стилей которые нужно добавить.

$tags = array(
	'span' => 'color: #000;',
	'p'    => 'padding: 0;',
	'img'  => 'border: none;'
);

PHP

1

Вариант на регулярных выражениях

Функция ищет теги, из них достает атрибуты, дописывает их и делает замену в тексте.

function add_html_style($html, $tags)
{
	foreach ($tags as $tag => $style) {
		preg_match_all('/<' . $tag . '([s].*?)?>/i', $html, $matchs, PREG_SET_ORDER); 
		foreach ($matchs as $match) {
			$attrs = array();
			if (!empty($match[1])) {
				preg_match_all('/[ ]?(.*?)=["|'](.*?)["|'][ ]?/', $match[1], $chanks);
				if (!empty($chanks[1]) && !empty($chanks[2])) {
					$attrs = array_combine($chanks[1], $chanks[2]);
				}
			}

			if (empty($attrs['style'])) {
				$attrs['style'] = $style;
			} else {
				$attrs['style'] = rtrim($attrs['style'], '; ') . '; ' . $style;
			}

			$compile = array();
			foreach ($attrs as $name => $value) {
				$compile[] = $name . '="' . $value . '"';
			}

			$html = str_replace($match[0], '<' . $tag . ' ' . implode(' ', $compile) . '>', $html);
		}
	}

	return $html;
}

echo add_html_style($html, $tags);

PHP

Результат работы функции

<p style="padding: 0;">Текст <span style="color: #000;">1</span></p>
<p style="text-align: center; padding: 0;">Текст 2</p>
<img src="/uploads/logo.png" style="border: none">

2

Вариант на phpQuery

phpQuery на Google Code

Особенности:

  • Приводит HTML код к валидному виду — закрывает незакрытые теги, удаляет лишние пробелы, переводит названия тегов и атрибутов в нижний регистр.
  • Заменяет мнемоники на символы.
require '/phpQuery.php';

$dom = phpQuery::newDocument($html);
foreach ($tags as $tag => $style) {
	$elements = $dom->find($tag);
	foreach ($elements as $element) {
		$pq = pq($element);
		$attrs = $pq->attr('style');
		if (empty($attrs)) {
			$pq->attr('style', $style);
		} else {
			$pq->attr('style', rtrim($attrs, '; ') . '; ' . $style);
		}
	}
}

echo (string) $dom;

PHP

Результат

<p style="padding: 0;">Текст <span style="color: #000;">1</span></p>
<p style="text-align: center; padding: 0;">Текст 2</p>
<img src="/uploads/logo.png" style="border: none">

3

Вариант на классе DOMDocument

В данном случаи не подходит т.к. к верстке добавляется теги <html>, <head>, <body>.

$doc = new DOMDocument('1.0', 'UTF-8');
@$doc->loadHTML($html);
foreach ($tags as $tag => $style) {
	$elements = $doc->getElementsByTagName($tag);
	foreach ($elements as $element) {
		$attrs = $element->getAttribute('style');
		if (empty($attrs)) {
			$element->setAttribute('style', $style);
		} else {
			$element->setAttribute('style', rtrim($attrs, '; ') . '; ' . $style);
		}
	}
}

echo html_entity_decode($doc->saveHTML());

PHP

Результат

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<body>
	<p style="padding: 0;">Текст <span style="color: #000;">1</span></p>
	<p style="text-align: center; padding: 0;">Текст 2</p>
	<img src="/uploads/logo.png" style="border: none">
</body>
</html>

25.12.2016, обновлено 21.09.2019

Другие публикации

Поиск похожих текстов в базе данных MySQL + PHP

Один из вариантов поиска похожих статей в базе данных основан на схождении слов в двух текстах.

PHP транслит

PHP функции для перевода текста, ЧПУ, ссылок и имен файлов в транслит.

Преобразование цветов в PHP

Несколько примеров как перевести цвета из HEX в RGB и обратно с помощью PHP.

Работа с директориями в PHP

Набор PHP функций для работы с директориями, получение списка файлов в папке, копирование и удаление содержимого папок.

Шаблонизатор Smarty

Smarty это компилирующий обработчик шаблонов для PHP позволяющий отделить логику и HTML-верстку веб-приложения.

Мануал по созданию и форматированию excel файлов в PHPExcel

К сожалению разработчики прекратили поддержку и разработку проекта, но PHPExcel все равно остается популярной…

FallenSoul


Добрый день. Прочитал руководства по установке апач+пхп+Mysql, учебник по пхп- всё очень хорошо написано и главное работает.

Но вот что я не нашел в учебнике. Каким образом реализуется механизм изменения содержимого .пхп страницы ?

Вот index.php на котором 2 формы для входа в систему. Как в этом отрывке

      if(strcmp($login,$row->login)==0 && strcmp($pass,$row->passw)==0)
       {

                 }

реализовать «очистку страницы» и вывода на абсолютно чистой новой странице с тем же адресом в URL /index.php сообщение вида «Добро пожаловать.», но чтобы ни форм ничего другого там не было а только текст. Весьма благодарен.

<html>
<head>
 <title> Игра </title>
</head>

<body>
<font face=»Verdana» size=1>
<br><hr size=3 color=red>
<form action=/index.php method=»get»>
<br><b> Login : </b>
<br><input type=»text» name=»login» value=»» emptyok=»true»>
<br><b> Password :</b>
<br><input type=»text» name=»password» value=»» emptyok=»true»>
<br><br><input type=»submit» value=»Войти»>
</form>
<a href=/registration.php > Регистрация </a>
</font>

<?

include «config.php»;

  $login=$HTTP_GET_VARS[‘login’];
  $pass=$HTTP_GET_VARS[‘password’]; 
  $play=mysql_query(«select * from player;»);
  if($play)
   {
    while($row=mysql_fetch_object($play))
     {
      if(strcmp($login,$row->login)==0 && strcmp($pass,$row->passw)==0)
       {
          //
       }
     }
   }
?>
</body>
</html>


Записан
RXL

Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW


1. $HTTP_GET_VARS[‘login’]
Это давно устаревшая форма получения данных запроса. Следует пользоваться массивом $_GET. Точно также с POST запросом — $_POST.

2. Проверка логин/пароля.
Перебор всех строк — крайне негуманный и неудобный метод. Укажи проверяемое в запросе.

<?php
$query = «
        SELECT *
        FROM player
        WHERE login = ‘»
. mysql_escape_string($login) . «‘
                AND passw = ‘»
. mysql_escape_string($pass) . «‘»;
$res = mysql_query($query);
if (mysql_num_rows($res) == 0)
{
        // not logged in
}
else
{
        // now logged
}
mysql_free_result($res);
?>

3. Изменение состава выводимой страницы.
Можно использовать множество способов. Например, самый простой, но и самый неудобный из-за смешивания php-кода и html и плохой читаемости.

<?php
if ($condition)
{
?>
…одни данные…
<?php
}
else
{
?>
…другие данные…
<?php
}
?>


Записан

… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

FallenSoul


По поводу первых 2х пунктов я понял, а что касается третьего:

Допустим у нас 3 страницы- Главная с формами для заполнения, промежуток с приветствием «Добро пожаловать » такой то юзер, содержимое отображающееся только для авторизированного юзера. Какое взять условие для этих 3х случаев?


Записан
RXL

Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW


Если попроще, то так:

<?php
switch($condition)
{
  case 0:
    include(‘file0.html’);
    break;
  case 1:
    include(‘file1.html’);
    break;
  case 2:
    include(‘file2.html’);
    break;
  default:
    include(‘file_default.html’);
    break;
}
?>


Записан

… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

FallenSoul


Еще один вопрос … Как передавать допустим со страницы «Добро пожаловать» на следующую на которую переход будет по ссылке допустим переменную чтобы проверять какого её значение, в подтверждение того что пользователь попал в авторизованную зону введя логин и пароль предварительно. ?

« Последнее редактирование: 17-08-2007 07:01 от FallenSoul »
Записан
Sla

Команда клуба

ua
Offline Offline
Пол: Мужской

WWW


например так:
h**p://myexample.com/index.php?object=myobject


Записан

Мы все учились понемногу… Чему-нибудь и как-нибудь.

FallenSoul


Не совсем понял. Точнее понял, но не до конца.

Вот у меня после проверки на первой странице правильности ввода логина/пароля отображается следующее

Добро пожаловать.
<a href=/main.php?enter=$enter> Вход </a>

Выше я переменной $enter задавал значение если она в положительной ветке условного оператора который проверяет правильность ввода логина/пароля. А на следующей странице адресс у меня выглядит как main.php?enter=$enter,но проверку

if($enter==0)
 {
  ?>

  <font face=Verdana size=1>
   Зайдите заного с Главной страницы
  </font>

  <?

  }
else if($enter==1)
      {

       ?>
//
   <?
      }

Не проходит.


Записан
RXL

Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW


FallenSoul, тебя спасет использование сессий. См. в мануале session_start() и все, что написано рядом. Загляни в наши статьи — год назад я писал по этому делу.


Записан

… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

FallenSoul


<?

$today = date(«m.d.y H:i:s»);

if(!empty($name) && !empty($pass) && !empty($nick))
 {
  if($born==1 || $born==2)
   {
    $play=»
           select *
           from player
           where login = ‘» . mysql_escape_string($name) . «‘
          «;

    $sql=mysql_query($play);

    if($x==0 && mysql_num_rows($sql) > 0) echo «Такой логин уже существует»;
    else
     if($x==0 && mysql_num_rows($sql) == 0)
      {

              mysql_query(«insert into player values (NULL,’$name’,’$pass’,’$nick’,’$sex’,’$born’,NULL,’$today’) «);
       echo «Вы зарегистрированы и можете войти в игру.»;

      }
   }
 }

?>

Сессии потихоньку осваиваю-а вот отрывок из регистрации которую переписал в том стиле в котором мне написали авторизацию. Здесь есть какие то неточности или что-то лишнее ?


Записан
FallenSoul


Вопрос по поводу php и MySql.

При регистрации мне приходится выполнять след. запрос :

      mysql_query(«insert into player values (NULL,’$name’,’$pass’,’$nick’,’$sex’,’$born’,’0′,’0′,’3′,’3′,’3′,’$today’) «);

хотя предпоследние 5 параметров 0,0,…,3 у меня в таблице равны соответствующим числам по default’у,но не указывая их или оставляя пустым содержимое ковычек, добавлять новую запись в таблицу не хочет.

3 вопроса.
1. Можно ли как-то опустить наличие этих ковычек в запросе ?
2. Как действует дефолт значения у столбца если при создании записи всё равно надо указывать значение этого столбца?
3. MySql дружит с кирилицей? Дело в том что если разрешить создавать записи,в которых будет присутствовать кирилица,- то выводя их на страницах пхп проблем никаких нет, однако если просматривать содержащиеся в таблице соответствующие записи,то вся кирилица превращается в абру кадабру.

« Последнее редактирование: 17-08-2007 21:11 от FallenSoul »
Записан
RXL

Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW


FallenSoul, связывать интерактивные страницы можно по разному. Типичный подход: сохранение параметров в сессии.
При старте страницы запускаешь сессию — данные (если это не первый заход этой сессии) подкачиваются автоматом в массив $_SESSION. При завершении страницы массив также автоматически сохраняется.
Подробно здесь: https://club.shelek.ru/view.php?id=28 : прочти «Сессии PHP. Часть 1.» — этого достаточно для понимания сессий.
В статье «Создание динамического веб-сайта, с использованием ПХП(часть первая)» рассматривается пример, подобный приведенному мною выше.

Вопрос по поводу php и MySql.

При регистрации мне приходится выполнять след. запрос :

      mysql_query(«insert into player values (NULL,’$name’,’$pass’,’$nick’,’$sex’,’$born’,’0′,’0′,’3′,’3′,’3′,’$today’) «);

хотя предпоследние 5 параметров 0,0,…,3 у меня в таблице равны соответствующим числам по default’у,но не указывая их или оставляя пустым содержимое ковычек, добавлять новую запись в таблицу не хочет.

3 вопроса.
1. Можно ли как-то опустить наличие этих ковычек в запросе ?
2. Как действует дефолт значения у столбца если при создании записи всё равно надо указывать значение этого столбца?
3. MySql дружит с кирилицей? Дело в том что если разрешить создавать записи,в которых будет присутствовать кирилица,- то выводя их на страницах пхп проблем никаких нет, однако если просматривать содержащиеся в таблице соответствующие записи,то вся кирилица превращается в абру кадабру.

1. Можно.
Кроме того, крайне небезопасно делать так, как в твоем примере — выше я уже указывал, что нужно делать со строками перед помещением их в SQL-запрос: обрабатывать ф-ией mysql_escape_string(). Почитай в инете о «SQL-Injection» — полезно знать.

2. Вообще, это вопрос не по web — см. его в мануале по MySQL. Для вставки неполной строки нужно указать список столбцов.

INSERT INTO TABLE (col1, col7, col8, col9) VALUES (1, 7, 8, 9)

3. Это проблема не MySQL, а утилиты, которой ты пользуешься. Если, к примеру, у тебя винда и ты хранишь в базе текст в кодировке windows-1251, при просмотре его через консольную утилиту получишь мусор, т.к. виндовая консоль работает с кодировкой cp866 (дебильное наследие прошлого). Для удобства администрирования поставь PHPMyAdmin — web-инструмент для администрирования MySQL.


Записан

… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

FallenSoul


Каждый день узнаю всё больше и больше нового для себя, и спс тебе за это =)

Поставил пхпадмин, изменил код занесения учетной записи в таблицу при регистрации на следующий :

        $query=»insert into player values
         (NULL,
          ‘».mysql_escape_string($name).»‘,
          ‘».mysql_escape_string($pass).»‘,
          ‘».mysql_escape_string($nick).»‘,
          ‘$sex’,’$born’,’0′,’0′,’3′,’3′,’3′,
          ‘».mysql_escape_string($today).»‘
         );»;
       $res=mysql_query($query);
       if($res) echo «Вы зарегистрированы и можете войти «;

Всё довольно удобно,но только ради интереса подскажи- почему и пхп админ показывает мне в столбце nick который при регистрации я ввожу русскими буквами абра кадабру?

id_player    login    passw    nick    sex    born    gold    level    str    dex    stam    regdate
     28        test    test   ìàêñ   1   1   0   0   3   3   3   08.18.07 12:22:12

Перед тем как занести, все текстовые переменные обрабатываю след. образом :

  $nick=$_POST[«nick»];
  $nick = substr($_POST[«nick»],0,32);
  $nick = htmlspecialchars(stripslashes($nick));

« Последнее редактирование: 18-08-2007 08:32 от FallenSoul »
Записан
RXL

Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW


‘$sex’,’$born’

Ты уверен, что тут именно числа? Если эти данные получены от клиента, то надо обязательно их проверить перед вставкой. Для чисел можно сделать так: $born = 0 + $born; Это автоматом конвертит строку в число и если она не является числом, то преобразуется в ноль.

Запомни важную вещь: все данные, полученные от клиента, потенциально опасные. Их нужно проверять и по возможности не использовать напрямую.

Напр., параметер sex. Это перечисляемый тип с конечным кол-вом значений и лучше передавать его в виде числа.

<?php
// предполагаем, что sex имеет три значения: 0 — unknown, 1 — man, 2 — woman

$sex = isset($_POST[‘sex’]) ? $_POST[‘sex’] : 0; // передан ли вообще параметер

if ($sex < 0 || $sex > 2)
    $sex = 0;
?>

$nick = htmlspecialchars(stripslashes($nick));

По моему это излишество.
htmlspecialchars() лучше использовать при выводе, а не вводе.
stripslashes() вообще не нужен, если у тебя в php не активирована фича magic quotes (тоже излишество).

Уникальные столбцы (напр. nick) полезно проверять до вставки или обработать ошибку вставки.

Кракозябры: не настроена кодировка PHPMyAdmin-а. Быстрее всего он у тебя объявил страницу как iso8859-1, а тебе нужно windows-1251. Посмотри в его настройках (в конфиге).
Проверить можно легко: загрузив страницу поменяй кодировку в браузере.


Записан

… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

FallenSoul


по поводу $sex и $born я специально сделал их числами и затем в самом коде в отличие от того какое значение принимают эти переменные происходит вывод.

   if($sex==1) (string)$sex=»Мужской»;
    else if($sex==2) (string)$sex=»Женский»;

    echo «<b>Пол : </b>» .$sex. «<br>»;

htmlspecialchars() , stripslashes() -это всё старался делать по учебнику чтобы защититься от всяких недоброжелателей Улыбаюсь уберу если лишнее.

Нашел следующие настройки- стояло и вправду iso8859-1, но заменив на windows-1251 ничего не изменилось =- Менял кодировку-толку 0.

$cfg[‘DefaultLang’] = ‘windows-1251’;
$cfg[‘Lang’]     = ‘windows-1251’;
$cfg[‘DefaultCharset’] = ‘windows-1251’;

3 А что можно придумать с взаимодействием 2х таблиц о кот. я выше попробовал изложить?


Записан
RXL

Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW


htmlspecialchars() , stripslashes() -это всё старался делать по учебнику чтобы защититься от всяких недоброжелателей Улыбаюсь уберу если лишнее.

Делать надо зная, что и зачем делается. Не торопись делать умные страницы — просто поэкспериментируй в ф-иями и посмотри, какая что делает. Рекомендую смотреть html-код генерируемой страницы — брузер может делать поблажки, но это не значит, что так можно делать.

$cfg[‘DefaultLang’] = ‘windows-1251’;
$cfg[‘Lang’]     = ‘windows-1251’;
$cfg[‘DefaultCharset’] = ‘windows-1251’;

Lang — это язык (language), а не кодировка. Оставь «en» или задай «ru» (если конечно есть его поддержка).
Посмотри свойства страницы в браузере — какая там кодировка.

3 А что можно придумать с взаимодействием 2х таблиц о кот. я выше попробовал изложить?

В теме нет «2-х таблиц». О чем речь?


Записан

… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

(PHP 5, PHP 7, PHP 8)

DOMElement::setAttributeДобавляет новый или изменяет существующий атрибут

Описание

public DOMElement::setAttribute(string $qualifiedName, string $value): DOMAttr|bool

Список параметров

qualifiedName

Имя атрибута.

value

Значение атрибута.

Возвращаемые значения

Созданный или изменённый объект класса DOMAttr
или false в случае возникновения ошибки.

Ошибки

DOM_NO_MODIFICATION_ALLOWED_ERR

Возникает, если узел доступен только для чтения.

Примеры

Пример #1 Установка значения атрибута


<?php
$doc
= new DOMDocument("1.0");
$node = $doc->createElement("para");
$newnode = $doc->appendChild($node);
$newnode->setAttribute("align", "left");
?>

Смотрите также

  • DOMElement::hasAttribute() — Проверяет, существует ли атрибут
  • DOMElement::getAttribute() — Возвращает значение атрибута
  • DOMElement::removeAttribute() — Удаляет атрибут

Rakesh Verma — rakeshnsony at gmail dot com

12 years ago


<?php
//Store your html into $html variable.
$html="
<html>
<head>
<title>Untitled Document</title>
</head>

<body>
    <a href='http://example.com'>Example</a><br>
    <a href='http://google.com'>Google</a><br>

        <a href='http://www.yahoo.com'>Yahoo</a><br>
</body>

</html>"

;$dom = new DOMDocument();
$dom->loadHTML($html);//Evaluate Anchor tag in HTML
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");

for (

$i = 0; $i < $hrefs->length; $i++) {
       
$href = $hrefs->item($i);
       
$url = $href->getAttribute('href');//remove and set target attribute       
       
$href->removeAttribute('target');
       
$href->setAttribute("target", "_blank");$newURL=$url."/newurl";//remove and set href attribute       
       
$href->removeAttribute('href');
       
$href->setAttribute("href", $newURL);
}
// save html
$html=$dom->saveHTML();

echo

$html;?>

info at ensostudio dot ru

1 year ago


Solution to render HTML 5 tags with attributes with/without value:
<?php
$dom
= new DOMImplementation();
$doc = $dom->createDocument(null, 'html', $dom->createDocumentType('html'));$tag = $doc->appendChild($doc->createElement('input'));
$tag->setAttribute('type', 'text');
$tag->setAttribute('disabled', '');

echo

$doc->saveHTML($tag); // <input type="text" disabled="">$doc->normalize(); // normalize attributes
echo $doc->saveHTML($tag); // <input type="text" disabled>
?>

lehal2@hotmail

9 years ago


The use of Dom to first remove and then add the width and height to the first img tag from the text.I hope it help you to save your time
<?php
$html
= '

            <img src="http://www.example.com/images/header.jpg" width="898" height="223" style="border-bottom:5px solid #cccccc;"/>
        <img src="http://www.example.com/images/header2.jpg" width="898" height="223" style="border-bottom:5px solid #cccccc;"/>
        '

;$doc = DOMDocument::loadHTML($html);
$c =0;
foreach(
$doc->getElementsByTagName('img') as $image){
    if (
$c>0) continue;
    foreach(array(
'width', 'height') as $attribute_to_remove){
        echo
$attribute_to_remove;
        if(
$image->hasAttribute($attribute_to_remove)){
           
$image->removeAttribute($attribute_to_remove);

        }
        if(

$attribute_to_remove=='height'){
            if(!
$image->hasAttribute($attribute_to_remove)){
               
$image->setAttribute($attribute_to_remove,'220');

            }}
        if(

$attribute_to_remove=='width'){
      if(!
$image->hasAttribute($attribute_to_remove)){
           
$image->setAttribute($attribute_to_remove,'700');

        }}

$c = $c+1;
    }
}
echo
$doc->saveHTML();

address at gmail dot com

14 years ago


If wanting to set an attribute of an element with unique id of "1"

<?php
$dom
= new DomDocument();
$dom->load('test.xml');
$xp = new DomXPath($dom);
$res = $xp->query("//*[@id = '1']");
$res->item(0)->setAttribute('title','2');
$dom->save('test.xml');
?>


karvjorm at users.sourceforge.net

15 years ago


$dom = new DomDocument('1.0','iso-8859-15');

$ht_ml = $dom->appendChild($dom->createElement('html'));
$ht_ml->setAttribute('xmlns','http://www.w3.org/1999/xhtml');
$ht_ml->setAttribute('xml:lang','fi');
$ht_ml->setAttribute('lang','fi');

Result:

<?xml version="1.0" encoding="iso-8859-15"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi" lang="fi">


Vasil Rangelov

15 years ago


@karvjorm,
Using this method is not exactly a good practice. Infact, I think it may be a bug.
Names beginning with "xml" are reserved (for namespaces in this case).
setAttribute() should return false in this case I think, but I suppose it doesn't.

Still, the right way to do it is with createElementNS().
It lets you specify the namespace when creating the element node.

So the equivalent to yours ($html added to allow word wrapping) is:

$dom = new DomDocument('1.0','iso-8859-15');
$html = $dom->createElementNS('http://www.w3.org/1999/xhtml', 'html');
$ht_ml = $dom->appendChild($html);
$ht_ml->setAttribute('xml:lang','fi');
$ht_ml->setAttribute('lang','fi');


Понравилась статья? Поделить с друзьями:
  • Как изменить html файл на телефоне
  • Как изменить html файл на сервере
  • Как изменить html файл python
  • Как изменить html на https
  • Как изменить html код страницы на телефоне