Jump to content
  • 0

Вопросы по PHP.


Kompilator
 Share

Question

Здравствуйте.

Для создания сайта потребовался PHP, в этой теме буду задавать вопросы знатокам.

Пока справляюсь сам, но вот возник вопрос - при формировании таблицы для отображения данных из БД как лучше выводить HTML ? Т.е. каждый шаг цикла (строка БД) выводить посредством "echo" или накапливать всю таблицу в переменной, а потом сразу-  "echo $text;" ?

Как правильнее, или быстрее исполняется или еще что нибудь ?

Link to comment
Share on other sites

Recommended Posts

  • 0

 

Ну, удобный синтаксис. Да и какой смысл в подготовленный запросах, если всё равно он выполняется 1 раз?

Воспользовавшись SafeMySQL можно будет убрать проверку на допустимость вводимых символов ? например в связке 'логин - пароль', а то регулярное выражение /^[a-zA-Zа-яА-ЯёЁ0-9_-]{3,16}$/ толком не работает.

 

Нет, желательно оставить. У меня (тестировал в JS) эта регулярка отлично работает. Может дело в кодировке?

Link to comment
Share on other sites

  • 0
Может дело в кодировке?

Скорее всего.

Напомните, вроде Вы писали какую то инструкцию, через которую надо прогонять текст, что бы с кодировкой не было проблем.

И вот ещё.

Если пытаюсь в комментарии поставить знак одинарной кавычки - ', база ругается - "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 '15.09.05')' at line 1".

upd: с этим разобрался экранированием спец симфолов - mysql_escape_string

А если все переменные пришедшие через GET прогнать сквозь - mysql_escape_string ? безопасность такая как в SafeMySQL не достигнется ?

Edited by Kompilator
Link to comment
Share on other sites

  • 0

Почитал инфу и  решил делать таки подготовленными выражениями.

И как водится, сразу, прямо в первой строчке ошибка - Access denied for user 'u1084818'@'localhost' (using password: YES)

$mysqli = new mysqli('localhost', 'u1084818', '***', '***'); 

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

Подставил свои значения пароля, имени базы и юзера (юзера в MySQL не было, может в нем проблема), локалхост не знаю что такое, но видимо без изменения везде.

Значения скопировал из работающего соединения.

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

Вроде соединился.

Теперь не могу записать 1 байт в таблицу, в примерах везде разный синтаксис, и так и сяк пробую, никак пока.

Edited by Kompilator
Link to comment
Share on other sites

  • 0
А если все переменные пришедшие через GET прогнать сквозь - mysql_escape_string ? безопасность такая как в SafeMySQL не достигнется ?
 

Да, учитывая, что её SafeMySQL и работает:

	private function escapeString($value)	{		if ($value === NULL)		{			return 'NULL';		}		return	"'".mysqli_real_escape_string($this->conn,$value)."'";	}
Link to comment
Share on other sites

  • 0

Понимаю, что это смешно, но третий час бьюсь и не могу вставить в таблицу два значения.

Уже отпала охота переходить на mysqli и оставаться на mysql.

Перепробовал кучу примеров из интернета, ни одни не пишет ничего в базу.

Вот два из них:

<?php								$mysqli = new mysqli('localhost', 'u1084818_bikel', '***', 'u1084818_bikel'); 						if (mysqli_connect_errno()) { 							printf("Подключение невозможно: %s\n", mysqli_connect_error()); 							exit(); 						} else {}												//$stmt = $mysqli->prepare("INSERT INTO comment (id, userid) VALUES (?,?,)") or die($this->db->error); 						//$stmt->bind_param('ss', $code, $language); 						//$code = '1'; 						//$language = '2'; 						//$stmt->execute(); 												$stmt = $dbh->prepare("INSERT INTO comment (id, userid) VALUES (:name, :value)");						$stmt->bindParam(':name', $name);						$stmt->bindParam(':value', $value);												$name = 'one';						$value = 1;						$stmt->execute();						$stmt->close(); 						$mysqli->close(); 						?>	

На листинге 2 обращения, 1-закомментировано, 2-е нет, ни одно не работает.

Может быть что бы заработал этот код, надо доустановить какие нибудь модули ?

Edited by Kompilator
Link to comment
Share on other sites

  • 0

C записью разобрался, сижу с 9-ти утра и всё из-за того, что в сети полно некорректных примеров, в том числе и в предыдущем сообщении.

Кстати этот пример дали в этом сообщении - http://htmlforum.ru/index.php?showtopic=53757&p=360941

, ссылка ведёт на с виду уважаемый ресурс http://php.net, на котором опубликован нерабочий пример, который в свою очередь отнял у меня пол дня времени.

Link to comment
Share on other sites

  • 0

И так не работало?

$mysqli = new mysqli('localhost', 'u1084818_bikel', '***', 'u1084818_bikel'); 						$stmt = mysqli->prepare("INSERT INTO comment (id, userid) VALUES (:name, :value)");						$stmt->bindParam(':name', $name);						$stmt->bindParam(':value', $value);												$name = 'one';						$value = 1;						$stmt->execute();						$mysqli->close(); 
Edited by afdw
Link to comment
Share on other sites

  • 0

 

И так не работало?

$mysqli = new mysqli('localhost', 'u1084818_bikel', '***', 'u1084818_bikel'); 						$stmt = mysqli->prepare("INSERT INTO comment (id, userid) VALUES (:name, :value)");						$stmt->bindParam(':name', $name);						$stmt->bindParam(':value', $value);												$name = 'one';						$value = 1;						$stmt->execute();						$mysqli->close(); 

 

 

 

И так не работало?

Нет, ради интереса сделайте страничку и попробуйте.

Сама инструкция пишется bind_param , а не bindparam, пропущено нижнее подчёркивание.

И первым аргументом обязательно указывать тип переменной: i,b,d или s.

А вот этот код работает:

$mysqli = new mysqli('localhost', 'u1084818_bikel', '***', 'u1084818_bikel'); 												if ($mysqli->connect_errno) {exit('Error connect: ' . $mysqli->connect_error);}												 						$stmt = $mysqli->prepare('insert into comment(id) value (?)');						 						$i = 88;												$stmt->bind_param('i', $i);													$stmt->execute();											$stmt->close();
Edited by Kompilator
Link to comment
Share on other sites

  • 0

 

Блин да это же PDO, а не MySQLi! Вот правильные примеры!

Именно из этого примера я и сделал свой код удалив комментарии и ИФы.

 

Это говорит, что пример из php.net всё таки был рабочий. И вот я не понимаю, зачем в php 3 (MySQL, MySQLi, PDO) расширения для подключения к mysql, при чём у некоторых из них есть и функциональный, и ООП вариант?

Edited by afdw
Link to comment
Share on other sites

  • 0
И вот я не понимаю, зачем в php 3 (MySQL, MySQLi, PDO) расширения для подключения к mysql, при чём у некоторых из них есть и функциональный, и ООП вариант?

Ну это не ко мне вопрос =).

Спасибо.

Link to comment
Share on other sites

  • 0

php3 ? Вы издеваетесь? Тыкнете пальцем где эта древность ещё используется. Ориентируйтесь на php 5.3+ и изредко на 5.2 в старых проектах.

 

В плане mysql сейчас есть два актуальных расширения это mysqli и PDO, если вы создаете приложение с нуля то используйте одно из них. Забудьте о mysql оно устарело и сами разработчики пытаются отучить от него программистов.

 

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

Link to comment
Share on other sites

  • 0
php3 ? Вы издеваетесь? Тыкнете пальцем где эта древность ещё используется. Ориентируйтесь на php 5.3+ и изредко на 5.2 в старых проектах.
 

Я имел ввиду не php3, а 3 расширения :)


В плане mysql сейчас есть два актуальных расширения это mysqli и PDO, если вы создаете приложение с нуля то используйте одно из них. Забудьте о mysql оно устарело и сами разработчики пытаются отучить от него программистов.
 

Ну вот я и спрашиваю, зачем несколько расширений, фактически делающих одно и тоже и создавая вот такую вот путаницу.

Link to comment
Share on other sites

  • 0
Я имел ввиду не php3, а 3 расширения :)

ааа, тогда все намного проще =) mysql самое старое расширение, и от него пытаются уйти. mysqli это более новое и продвинутое, а PDO это только объектная часть и поддержка множества СУБД. Забудте о mysql  и выбирайте только из mysqli  и PDO вот в этом плане есть небольшая статья http://ruseller.com/lessons.php?rub=37&id=1381

Link to comment
Share on other sites

  • 0

О !

Пока вы на форуме, два самых умных ума на форуме, может добьём мою проверку ?

if (preg_match("/^[a-zA-Zа-яА-ЯёЁ0-9_-]{3,16}$/", $loginreg) && preg_match("/^[a-zA-Z0-9_-]{3,16}$/", $passreg))

Не проходят русские буквы в $loginreg.

По ссылке если попробовать зарегистрироваться, не пускает.

http://велосвет.рф/compare.html?idright=32&idleft=32&navmenur=Kompilatorright&navmenul=Kompilatorleft&resimg=1&scrtop=520

Link to comment
Share on other sites

  • 0

О !

Пока вы на форуме, два самых умных ума на форуме, может добьём мою проверку ?

if (preg_match("/^[a-zA-Zа-яА-ЯёЁ0-9_-]{3,16}$/", $loginreg) && preg_match("/^[a-zA-Z0-9_-]{3,16}$/", $passreg))

Не проходят русские буквы в $loginreg.

По ссылке если попробовать зарегистрироваться, не пускает.

http://велосвет.рф/compare.html?idright=32&idleft=32&navmenur=Kompilatorright&navmenul=Kompilatorleft&resimg=1&scrtop=520

пароль я бы ограничивал по символам пробела и перевода строки. Знаете почему? Потому что чем больше символов в разрешенном диапазоне тем больше криптостойкость пароля, плюс для sql инъекций пробелы необходимы.

 

Так что для пароля хватит вот такого на мой взгляд

/^\S{3,16}$/

А для логина и кириллицы возможно вам нужно добавить поддержку юникода в регулярном выражении, плюс можно упростить выражение добавив неразборчивость по регистру

/^[a-zа-яё0-9_-]{3,16}$/iu
Link to comment
Share on other sites

  • 0
Так что для пароля хватит вот такого на мой взгляд /^\S{3,16}$/
А для логина и кириллицы возможно вам нужно добавить поддержку юникода в регулярном выражении, плюс можно упростить выражение добавив неразборчивость по регистру

Пароль исправил на Ваш, да, так правильнее будет.

А логин русские и с Вашим вариантом не пускает.

Может как в пароле сделать, только пробелы запретить ?

Edited by Kompilator
Link to comment
Share on other sites

  • 0
Может как в пароле сделать, только пробелы запретить ?

Сделайте логин по мылу. и для проверки хватит filter_var($mailFILTER_VALIDATE_EMAIL) 


Пароль исправил на Ваш, да, так правильнее будет. А логин русские и с Вашим вариантом не пускает. —

 

/^[a-zа-яё0-9_-]{3,16}$/iu

 

Этот вариант должен работать. проверяйте, может не правильно указали

Link to comment
Share on other sites

  • 0

Этот вариант должен работать. проверяйте, может не правильно указали

 

Вот, скопировал прямо из кода:

if (preg_match("/^[a-zа-яё0-9_-]{3,16}$/iu", $loginreg) && preg_match("/^\S{3,16}$/", $passreg))
Link to comment
Share on other sites

  • 0

 

Этот вариант должен работать. проверяйте, может не правильно указали

 

Вот, скопировал прямо из кода:

if (preg_match("/^[a-zа-яё0-9_-]{3,16}$/iu", $loginreg) && preg_match("/^\S{3,16}$/", $passreg))
"/^\S{3,16}$/u"
Link to comment
Share on other sites

  • 0

Кстати сказать Николя прав.

 

Что есть зарегистрированный пользователь? Это логин+пароль+пользовательские данные

 

1. Логин - определяем есть ли такой пользователь в системе, если нет то и пароль нет смысла проверять.

2. Пароль - если пользователь по логину найден то проверяем пароль.

3. Если пользователь по паре логин/пароль определен и авторизован то выдаем его данные.

 

В качестве логина на данный момент лучше всего использовать email или номер телефона. Эти данные пользователь вряд ли забудет плюс это удобно ибо и то и другое уникально =).

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share


×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy