Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Код через изображение

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
Staind
Отправлено: 12 Ноября, 2007 - 22:34:53
Post Id



Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Нояб. 2007  
Откуда: Планета сокровищ


Помог: 0 раз(а)

[+]


Здравствуйте. Появилась проблема. На этот раз попытаюсь лучше описать:
Есть код:
PHP:
скопировать код в буфер обмена
  1.  
  2. global $check;
  3. $check = rand (1,2);
  4. if (isset($_GET['imagewr'])==true) {
  5. $xkey = md5 ("$check");
  6. header ("Content-type:image/jpeg");
  7. $image = imagecreatetruecolor(39,16);
  8. $color = imagecolorallocate($image,255,255,255);
  9. imagestring($image,5,2,0,$check,$color);
  10. imagejpeg($image,'',100);
  11. imagedestroy($image);
  12. }
  13. echo ("<html><head></head><body>");
  14. $phpself = $_SERVER['PHP_SELF'];
  15. echo ("<table><td><img src=$phpself?imagewr></td></table>");
  16. echo ("</body></html>");

Есть переменная $check, где содержиться рандомное число (в нашем случае 1 или 2). Есть вот такой вот скрипт. Он, значит, выводит цифру 1 или 2 ввиде изображения.
Самое интерессное, что эта самая переменная $check - глючит. А именно, если дописать после <img...> переменную $check и пару раз пообновлять страницу, то увидим, что на рисунке и само проверочное число - почему то иногда разные. Вот попробуйте написать так:
PHP:
скопировать код в буфер обмена
  1.  
  2. global $check;
  3. $check = rand (1,2);
  4. if (isset($_GET['imagewr'])==true) {
  5. $xkey = md5 ("$check");
  6. header ("Content-type:image/jpeg");
  7. $image = imagecreatetruecolor(39,16);
  8. $color = imagecolorallocate($image,255,255,255);
  9. imagestring($image,5,2,0,$check,$color);
  10. imagejpeg($image,'',100);
  11. imagedestroy($image);
  12. }
  13. echo ("<html><head></head><body>");
  14. $phpself = $_SERVER['PHP_SELF'];
  15. echo ("<table><td><img src=$phpself?imagewr></td><td>$check</td></table>");
  16. echo ("</body></html>");

и несколько раз понажимать F5 и иногда будут расхождения в результатах. Я просто дальше сделал функцию проверки введеных цифр с картинку ну и все глючить начинает (особенно если rand с 1000 до 9999). Помогите пожалуйста.

P.s. Способ с присвоением в img src=$phpself?imagewr=$check, а потом ее определять в самом ife - не прокатит, т.к. мне нужно все таки, чтобы передавалось скрытно.

И еще, мне нужно изначально, чтобы переменная $check была вне структуры if, чтобы потом я из нее извлекал md5 и отправлял скрытым полем в форме, а потом сверял.
 
 Top
evgenijj
Отправлено: 13 Ноября, 2007 - 10:43:09
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. if ( isset($_GET['imagewr']) ) {
  4.   $_SESSION['check'] = getCode();
  5.   header ("Content-type:image/jpeg");
  6.   $image = imagecreatetruecolor(100,16);
  7.   $color = imagecolorallocate($image,255,255,255);
  8.   imagestring($image,5,2,0,$_SESSION['check'],$color);
  9.   imagejpeg($image,'',100);
  10.   imagedestroy($image);
  11. } else {
  12.   if ( !isset( $_POST['submitForm'] ) ) {
  13.     echo "<form method='POST'>";
  14.     echo "<img src='".$_SERVER['PHP_SELF']."?imagewr' />";
  15.     echo "Code: <input type='text' name='code' value='' />";
  16.     echo "<input type='submit' name='submitForm' value='Go!' />";
  17.     echo "</form>";
  18.   } else {
  19.     if ( isset($_SESSION['check']) and $_SESSION['check'] == $_POST['code'] )
  20.       echo 'ok';
  21.     else
  22.       echo 'wrong';
  23.     unset( $_SESSION['check'] );
  24.   }
  25. }
  26. function getCode() {
  27.   $length = rand( 5, 10);
  28.   $code = '';
  29.   for( $i = 0; $i < $length; $i++ ) {
  30.     $range = rand(1, 3);
  31.     switch( $range ) {
  32.       case 1: $code = $code.chr( rand(48, 57) );  break;
  33.       case 2: $code = $code.chr( rand(65, 90) );  break;
  34.       case 3: $code = $code.chr( rand(97, 122) ); break;
  35.     }
  36.   }
  37.   return $code;
  38. }
  39. ?>
  40.  
 
 Top
Staind
Отправлено: 13 Ноября, 2007 - 18:27:37
Post Id



Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Нояб. 2007  
Откуда: Планета сокровищ


Помог: 0 раз(а)

[+]


evgenijj, спасибо, прмерно также сделал. Тут проблема возникла, а если пользователь запретит принятие cookie, то и сессия не сможет сохранится (по крайне мере у меня опять все сглючило, как только я поставил запрет на принятие cookie). Следовательно - как быть?
 
 Top
evgenijj
Отправлено: 13 Ноября, 2007 - 19:52:46
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Staind пишет:
evgenijj, спасибо, прмерно также сделал. Тут проблема возникла, а если пользователь запретит принятие cookie, то и сессия не сможет сохранится (по крайне мере у меня опять все сглючило, как только я поставил запрет на принятие cookie). Следовательно - как быть?

http://phpfaq[dot]ru/sessions
Цитата:

Сессии используют стандартные, хорошо известные способы передачи данных. Собственно, других-то просто и нет.
Идентификатор - это обычная переменная. По умолчанию ее имя - PHPSESSID.
Задача PHP отправить ее браузеру, чтобы тот вернул ее со следующим запросом. Из уже упоминавшегося раздела FAQ ясно, что переменную можно передать только двумя способами: в куках или POST/GET запросом.
PHP использует оба варианта.
За это отвечают две настройки в php.ini:
session.use_cookies - если равно 1, то PHP передает идентификатор в куках, если 0 - то нет.
session.use_trans_sid если равно 1, то PHP передает его, добавляя к URL и формам, если 0 - то нет.
Менять эти и другие параметры сессий можно так же, как и другие настройки PHP - в файле php.ini, а так же с помощью команды ini_set()

Цитата:

По умолчанию в последних версиях PHP включены обе опции. Как PHP поступает в этом случае? Кука выставляется всегда. А ссылки автодополняются только если РНР не обнаружил куку с идентификатором сессии. Когда пользователь в первый раз за этот сеанс заходит на сайт, ему ставится кука, и дополняются ссылки. При следующем запросе, если куки поддерживаются, PHP видит куку и перестает дополнять ссылки. Если куки не работают, то PHP продолжает исправно добавлять ид к ссылкам, и сессия не теряется.
Пользователи, у которых работают куки, увидят длинную ссылку с PHPSESSID только один раз.
 
 Top
Staind
Отправлено: 13 Ноября, 2007 - 22:00:14
Post Id



Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Нояб. 2007  
Откуда: Планета сокровищ


Помог: 0 раз(а)

[+]


evgenijj, нет. И это, как я понял, не проблема в запоминании SID. Если я пишу так:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. //Начинаем сессию
  3. session_name("code");
  4. //Обработка рисунка
  5.  if (isset($_GET['imagewr'])==true) {
  6.  $checkcode = rand (1,4);
  7.  $_SESSION['check'] = md5($checkcode);
  8.  header ("Content-type:image/jpeg");
  9.  $image = imagecreatetruecolor(39,16);
  10.  $color = imagecolorallocate($image,255,255,255);
  11.  imagestring($image,5,2,0,$checkcode,$color);
  12.  imagejpeg($image,'',100);
  13.  imagedestroy($image);
  14.  }
  15. //Вывод рисунка
  16.  echo ("<html><head></head><body>");
  17.  $phpself = $_SERVER['PHP_SELF'];
  18.  echo ("<table><td><img src=$phpself?imagewr></td></table>");
  19. //Выводим переменную из сессии и видим, что интерпретатор ее не находит
  20.  $check2 = $_SESSION['check'];
  21.  echo ("$check2");
  22.  echo ("</body></html>");
  23. ?>
  24.  

То интерпретатор не находит переменную $_SESSION['check']. Однако, если я вытащу $checkcode = rand (1,4); и $_SESSION['check'] = md5($checkcode); из структуры if, то все получается! Вот я не могу понять - почему так?
P.s. Мне нужно, чтобы эти два присвоения были в структуре if, иначе тоже глюк будет :
 
 Top
valenok Модератор
Отправлено: 13 Ноября, 2007 - 23:03:14
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




На форуме есть раздел "Пользовательские функции".
Посмотрите там готовый пример


-----
Truly yours, Sasha.
 
My status
 Top
evgenijj
Отправлено: 14 Ноября, 2007 - 10:04:13
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Невнимательно читал статью
http://www.phpfaq[dot]ru/sessions
Цитата:

Еще одна проблема может возникнуть, если вы используете перенаправление через header или навигацию с помощью JavaScript.
Дело в том, что РНР автоматически дописывает идентификатор сессии только к ссылкам вида < a href="..." >, но не делает этого для header-ов, яваскрипта, мета-тегов.
Поэтому надо добавлять идентификатор руками

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. if ( isset($_GET['imagewr']) ) {
  4.   header ('Content-type:image/jpeg');  
  5.   $image = imagecreatetruecolor(300,16);  
  6.   $color = imagecolorallocate($image,255,255,255);  
  7.   imagestring($image,5,2,0,$_SESSION['check'],$color);  
  8.   imagejpeg($image,'',100);  
  9.   imagedestroy($image);  
  10. } else {  
  11.   $checkcode = rand (1,4);
  12.   $_SESSION['check'] = md5($checkcode);
  13.   echo "<img src='".$_SERVER['PHP_SELF']."?imagewr=1&".session_name()."=".session_id()."'>";  
  14.   echo $_SESSION['check'];
  15. }
  16. ?>
  17.  
 
 Top
Staind
Отправлено: 14 Ноября, 2007 - 15:41:33
Post Id



Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Нояб. 2007  
Откуда: Планета сокровищ


Помог: 0 раз(а)

[+]


Блин, точно не умею читать. Огромное тебе спасибо и респект Улыбка
И еще, последний мелкий вопросик:
Вот есть страница с html тэгами (с инфой короче). Есть <img> тэг. Вот в данном примере я создаю изображение методом $_GET. А вообще - можно ли как -нибудь еще создать изображение. Через функцию пробовал - неполучилось. Или вот в данном примере - самый нормальный метод создания изображения?
 
 Top
valenok Модератор
Отправлено: 14 Ноября, 2007 - 15:44:46
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Делайте как делаете.
А вообще можно.


-----
Truly yours, Sasha.
 
My status
 Top
Staind
Отправлено: 14 Ноября, 2007 - 16:04:45
Post Id



Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Нояб. 2007  
Откуда: Планета сокровищ


Помог: 0 раз(а)

[+]


Окей, спс. Просто я такой способ в интернете откапал и думал, что есть лучше.
 
 Top
Staind
Отправлено: 15 Ноября, 2007 - 18:49:53
Post Id



Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Нояб. 2007  
Откуда: Планета сокровищ


Помог: 0 раз(а)

[+]


Чтобы не создавать новую темку, напишу здесь (это мелкий вопрос).
Есть страничка. При $_GET['param']=="archive" в адресной строке, появляется архив новостей. Однако можно сделать sql инъекцию, если не ввести дополнительные условия. Я особо не разобрался и взял и в начале всего скрипта указал:
PHP:
скопировать код в буфер обмена
  1.  
  2. if (isset($_GET['param'])==true and $_GET['param']!="archive") {
  3. unset ($_GET['param']);
  4. }
  5.  

И при этом все нормально стало, т.е. sql инъекцию теперь не ввести. Вот хотел спросить - это способ нормальный? или можно как то проще сделать?
 
 Top
valenok Модератор
Отправлено: 15 Ноября, 2007 - 21:38:52
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Сам запрос в студию.
А вообще если у вас парам принимает значение не только archive но и 5 других возможных
- то используйте конструкцию switch или условие с ф-цией in_array


-----
Truly yours, Sasha.
 
My status
 Top
Staind
Отправлено: 15 Ноября, 2007 - 22:32:02
Post Id



Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Нояб. 2007  
Откуда: Планета сокровищ


Помог: 0 раз(а)

[+]


Понял. Вот после той строчки у меня идет проверка еще одна и запрос:
PHP:
скопировать код в буфер обмена
  1. if (isset($_GET['param'])==true and $_GET['param']=="archive") $result = mysql_query ("SELECT * FROM files ORDER BY id DESC");

По поводу свича, прочитал только что про нее - действительно, удобная вещь, надо будет разбираться тогда Улыбка
 
 Top
valenok Модератор
Отправлено: 16 Ноября, 2007 - 13:40:19
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Да, вы пожалуй сначала разберитесь, а потом решите что и как вам нужно.
http://php.net/switch


-----
Truly yours, Sasha.
 
My status
 Top
Staind
Отправлено: 17 Ноября, 2007 - 13:53:01
Post Id



Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Нояб. 2007  
Откуда: Планета сокровищ


Помог: 0 раз(а)

[+]


Еще маленькая проблема, если у кого-нибудь будет время - помогите пожалуйста.
Есть скрипт, который обрабатывает и добавляет новость.
PHP:
скопировать код в буфер обмена
  1. if (isset ($_POST['createnew'])==true) {
  2. $namenew = $_POST['namenew'];
  3. $content = $_POST['content'];
  4. $id = mysql_query ("SELECT * FROM new ORDER BY id DESC LIMIT 1");
  5. $id = mysql_fetch_assoc($id);
  6. $id2 = $id['id'] + 1;
  7. mysql_query("INSERT INTO new(id,name,discription) VALUES ('$id2','$namenew','$content')");
  8. header ("Location:addnews.php");
  9. }

В конце у меня стоит "header ("Location:addnews.php");" специально для того, чтобы при нажатии на F5 не дублировалась в базу новость. Тем самым я ни как не могу вывести сообщения типа "Новость добавлена" или там "В содержании новости мало символов". Вот и встал вопрос: "А как можно тогда добавлять сообщения в нужный мне участок HTML разметки?"
И еще назрел вопрос:
"А сколько будет храниться сессия во временном каталоге, если в php скрипте не указано полное ее уничтожение?"
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB