ОсновноеRadiotalkПользовательское
Программирование
6   •   Посмотреть все темы

Вопросы из области php

 

6703
Андрей @ZloVeЩиЙ
Опять я со своими вопросами,
даже тему отдельную создал, потому как по ходу изучения и практики php языка они будут появляться.

На этот раз решил написать простенькую форму регистрации... практика, практика и еще раз практика.
Если без проверки то все ок, а когда пытаюсь прикрутить проверку, то сообщения об ошиб[ке|ках] выводятся, но данные все равно записываются в БД.

$connect = mysql_connect('localhost','root') or die(mysql_error());
mysql_select_db('dbname'); //успешный коннект

if (isset($_POST['reg'])) {

$login = $_POST['login'];
$password = $_POST['password']; // нажали кнопку, присвоили значения полей переменным

if($login != '' && $password != '') { // а не пустые ли поля? если не пустые проверяем дальше
if ((strlen($login) >= 3) and (strlen($login) <= 33)) { // размер от 3 до 33 символов ну и проверка ниже
$login = stripslashes($login);
$login = html_entity_decode($login);
$login = strip_tags($login);
}
else {echo "Вы ввели не корректные данные в поле Логин";}

if((strlen($password) >= 3) and (strlen($password) <= 33)) { // аналогично с полем пароль + шифруем его в md5
$password = stripslashes($password);
$password = html_entity_decode($password);
$password = strip_tags($password);
$password = md5('password');
}
else {echo "Вы ввели не корректные данные в поле Пароль";}
}

else {echo "Заполните обязательные поля.";}

}

1. Как и куда прикрутить запись в БД, когда данные введены верно!?
$query = mysql_query("INSERT INTO users VALUES('','$login','$password')")
or die(mysql_error());

2. На что еще можно проверить поля кроме как к-ва символов и наличия тегов?

Отредактировано ZloVeЩиЙ - 25.11.2013
6703
Андрей @ZloVeЩиЙ
Такой вариант нашелся с проверкой true|false:
$connect = mysql_connect('localhost','root') or die(mysql_error());
mysql_select_db('dbname');

if (isset($_POST['reg'])) {

$login = $_POST['login'];
$password = $_POST['password'];
$login_ok = true;
$password_ok = true;

if($login != '' && $password != '') {
if ((strlen($login) >= 3) and (strlen($login) <= 33)) {
$login = stripslashes($login);
$login = html_entity_decode($login);
$login = strip_tags($login);
}
else {
$login_ok = false;
echo "Вы ввели не корректные данные в поле Логин";}

if((strlen($password) >= 3) and (strlen($password) <= 33)) {
$password = stripslashes($password);
$password = html_entity_decode($password);
$password = strip_tags($password);
$password = md5('password');
}
else {
$password_ok = false;
echo "Вы ввели не корректные данные в поле Пароль";}
}
else {
$login_ok = false;
$password_ok = false;
echo "Заполните обязательные поля.";}
}
if($login_ok && $password_ok) {
$query = mysql_query("INSERT INTO users VALUES('','$login','$password')")
or die(mysql_error());
}

Но уж через чур он объёмный, можно как то проще это все дело проверять?

8497
Степан @Trilby
<?
$connect = mysql_connect('localhost','root') or die(mysql_error()); //вообще, лучше создать файл конфига и импортировать его, а не писать логины и пароли прямо в коде.
mysql_select_db('dbname');
mysql_query("SET NAMES utf8;");

function register($login, $password){
if (!(strlen($login) < 3 and strlen($login) > 33)){
return "Ошибка, логин не подхоидт по размеру";
};
if (!(strlen($password) < 3 and strlen($password) > 33)){
return "Ошибка, пароль не подхоидт по размеру";
};
$password = md5($password); //на самом деле, md5 ломается за пару секунд. Надо юзать RSA, но мне ща лень это писать...
$query = mysql_query("INSERT INTO users VALUES('','{$login}','{$password}');") or die(mysql_error());
return "success; $login registred";
}

$login = htmlspecialchars($_POST['login']);
$password = htmlspecialchars($_POST['password']);
$reg = htmlspecialchars($_POST['reg']);

if ($login and $password and $reg) {
echo register($login, $password);
}

?>

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

1555
Алексей @TheDark
не плохо было бы еще делать trim() с логином и паролем, чтобы убрать случайные пробелы) а пароль хранить в двойном md5()
ZloVeЩиЙ, на ********** достаточно подробно расписан простой вариант процесса регистрации/авторизации, может пригодится)

Отредактировано TheDark - 27.11.2013
6703
Андрей @ZloVeЩиЙ
Такой вопрос...
1. Можно ли на php вытащить скриншот из видео которое лежит на youtu.be имея ссылку?
2. Можно таких скриншотов сделать\вытащить несколько?

**********

Отредактировано ZloVeЩиЙ - 06.12.2013
1555
Алексей @TheDark
У меня вопрос не сложный, но я все никак не разберусь. Нужно обработать форму, занести данные в MySQL и вывести их на странице без перезагрузки самой страницы.
Как я понимаю, тут нужен AJAX. Но я с ним не работал и, вероятно, тут нужен более комплексный подход. Но времени у меня нет, а решение нужно.

Форма обычная, а данные на странице выводятся через mysql_query() и mysql_fetch_assoc() соответственно. Вопрос заключается в том, как обработать данные из $_POST не перезагружая страницу?

Форма, если что)
<form name='someform' method='post'>
<input type='text' name='name'>
<textarea cols='40' rows='4' name='text'></textarea>
<input type='submit' name='submit' value='SEND'>
</form>

Отредактировано TheDark - 15.12.2013
8497
Степан @Trilby
**********
Там все довольно просто... Подключается jQuery, с его помощью отправляются данные сервак (php-скрипт), там идет обработка/колдовство с mysql/возвращение данных... Возвращенные данные заносятся в форму. При минимальных знаниях английского все можно понять без документации даже

1555
Алексей @TheDark
Как можно сделать, чтобы содержимое страницы **********?page=about было доступно по адресу **********about?
Понимаю, дело с .htaccess, но если честно, не знаю как сформулировать запрос в гугле. Кто в курсе как это правильно делается?

8497
Степан @Trilby
RewriteEngine On
RewriteBase /
RewriteRule ^about$ /index.php?page=about [L]

первые две строки один раз в коде должны быть...

Отредактировано Trilby - 17.12.2013
1555
Алексей @TheDark
Trilby, круто) а как быть с ссылками, которые сформируются в будущем? скажем, появится статья с id=10 и в обычном случае я бы вывел ее как post.php?id=10... как сделать ее доступной по адресу, например, site.com/10.html?
или, что еще лучше - я в админке сделаю автоматический транслит названия статьи (чтобы "Вдохновение для дизайнера" превратилось в "vdohnovenie_dlya_dizainera") и помещу этот результат в бд. таким образом статью можно будет выводить как post.php?title=vdohnovenie_dlya_dizainera. Как сделать, чтобы адрес был вида site.com/vdohnovenie_dlya_dizainera ? и так для каждой новой статьи в будущем?

не открывать же каждый раз .htaccess и вносить правки?)

UPD. Нашел. ********** (там где о человеко-понятных урлах).

Отредактировано TheDark - 17.12.2013
1555
Алексей @TheDark
Для перебора данных массива использую foreach:
$array[] = 'one';
$array[] = 'two';
$array[] = 'three';
...
$array[] = 'twenty';
foreach ($array as $value) {
echo $value.",";
}

В результате все данные выводятся и разделяются запятой. Последний элемент массива тоже. Как сделать так, чтобы к последнему значению запятая не добавлялась? Тут надо как-то с ключем поиграться и там, где он последний применить правило. Но как сделать не знаю (:
Подскажите, плиз, как решить задачку)

8497
Степан @Trilby
Не нужно вывод делать циклом. Давно изобретен join.

$array[] = 'one';
$array[] = 'two';
$array[] = 'three';
$array[] = 'twenty';

echo implode(",", $array);

Если какие-то задачи будут, где надо выделить последний элемент в итерации, то здесь обычный if-else поможет:
**********

Отредактировано Trilby - 07.01.2014
1555
Алексей @TheDark
Trilby, нет, implode для меня не вариант. я привел упрощенный вариант цикла. на деле мне нужно с каждым элементом воздействовать, а не просто получить список.

8497
Степан @Trilby
TheDark пишет:

Trilby, нет, implode для меня не вариант. я привел упрощенный вариант цикла. на деле мне нужно с каждым элементом воздействовать, а не просто получить список.

я уже переписал свое сообщение. Там и на это ответ

Отредактировано Trilby - 07.01.2014
1555
Алексей @TheDark
Trilby, о, спасибо) я уже придумал вариант, используя array_pop() и array_push(), но в примерах нашелся вариант компактнее)

Отредактировано TheDark - 07.01.2014
20089
Dimitry @Dimitry
ну ещё как вариант

$out="";
foreach ($array as $value) {
if($out) $out.=","; $out.=$value;
}
echo $out;

1555
Алексей @TheDark
Не совсем из области PHP, но очень рядом) Вопрос по кодировке MySQL.
в install.php формируется запрос в бд о создании таблицы:
$create_table_pages = "CREATE TABLE pages
(
id INT(4) NOT NULL AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
text TEXT NOT NULL,
meta_d VARCHAR(255) NOT NULL,
meta_k VARCHAR(255) NOT NULL,
page VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
)ENGINE=MyISAM CHARACTER SET=cp1251;";

и выполяется mysql_query($create_table_pages)
В случае успеха, в эту таблицу сразу же заносятся стандартные данные (текст) на русском языке.
Но в таблицу все попадает в виде ???????. Кодировку я поставил cp1251, в бд тоже значится cp1251_general_ci
Пробовал к каждому полю дописывать CHARACTER SET cp1251 COLLATE cp1251_general_ci - эффекта ноль.

Интересно, что на локалке все нормально и таких траблов не возникает, а вот стоит залить в нет...) Кто знает как пофиксить?

UPD. Решил, может кому пригодится. После mysql_connect и mysql_select_db вставил:
mysql_query("SET NAMES 'cp1251'",$db);
mysql_query("SET character_set_client = cp1251",$db);
mysql_query("SET character_set_connection = cp1251",$db);
mysql_query("SET character_set_results = cp1251",$db);

Таким образом данные занеслись в бд правильно, но вывод все-равно был со знаками вопроса. Чтоб исправить нужно было в файле, где формируется подключение к бд (скажем, config.php) добавить:
$charset = "cp1251";
mysql_set_charset($charset);

Отредактировано TheDark - 10.01.2014
6703
Андрей @ZloVeЩиЙ
cp1251 ?
Все пытаются наоборот на UTF-8 перевести свои сайты !

1555
Алексей @TheDark
ZloVeЩиЙ, пока такой потребности не вижу...) привык как-то))

1555
Алексей @TheDark
пишу сюда, так как с регулярками почти не знаком, а ради этого изучать их не хочется)
как сделать так, чтобы текст, скажем, ********** автоматически становился ссылкой? Например, человек пишет комментарий на сайте и указывает такую ссылку) Нужно, чтобы при выводе комментария подобный текст становился ссылкой, причем, нечто вроде: /away.php?url=**********
кто поможет?