Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Передача переменной из js в php, посредством ajax (https://javascript.ru/forum/server/27971-peredacha-peremennojj-iz-js-v-php-posredstvom-ajax.html)

9xakep 01.05.2012 23:03

Передача переменной из js в php, посредством ajax
 
echo "
<input type='text' id='avatar'>
<input type='button' onclick='ava()' value='Установить аватар'>
<script>
function ava() {
var ava = document.getElementById('avatar').value
ava = encodeURIComponent(ava)
var r = new XMLHttpRequest; // создаем запрос
r.open('POST', 'login.php', true) // открываем
r.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // устанавливаем заголовок
r.send('login.php?ava='+ava) // что посылаем
}
</script>
";
function senn2() {
$a = $_POST['ava'];
mysql_query("INSERT INTO `users` (avatar) VALUES (\''.$a.'\') WHERE `name` = '$login' AND `pass` = '$pass'");
}
if($_SERVER['REQUEST_METHOD']=='POST') senn2();

В чем ошибка, вот примеры пост запроса:
login.php?ava=asdf

То есть запрос отправляется нормально, но в пхп странная проблема, где? В БД ничего не появляется?

Serg_pnz 01.05.2012 23:09

mysql_query("INSERT INTO `users` (avatar) VALUES (\''.$a.'\') WHERE `name` = '$login' AND `pass` = '$pass'");

ужоснах...

mysql_query('INSERT INTO `users` (avatar) VALUES ('.$a.') WHERE `name` = '.$login.' AND `pass` = '.$pass);

Обратите внимание, что данные надо фильтровать перед вставкой.

9xakep 01.05.2012 23:25

Serg_pnz,
так чтоли:
mysql_query("INSERT INTO `users` WHERE `name`=".$login."AND `pass`=".$pass."(avatar) VALUES (".$a.")")

P.S. просто учился по одному уроку, там так было

Serg_pnz 01.05.2012 23:32

9xakep,
я ж вроде написал во второй строке...

9xakep 01.05.2012 23:39

Цитата:

Сообщение от nasqad
самый первый вариант девятки самый правильный из предложенных

какой девятки? :blink:
Цитата:

Сообщение от Serg_pnz
9xakep,
я ж вроде написал во второй строке...

Цитата:

Обратите внимание, что данные надо фильтровать перед вставкой.
Я это расценил, как: where должен стоять до заполнения
Цитата:

Сообщение от наскад
что это за странный запрос, какой еще where у инсерта

Как тогда добавить в БД данные, в нужный логин и пароль?

Serg_pnz 01.05.2012 23:51

9xakep,
По пунктам тогда:
1. В Вашем коде синтаксис не верный
2. Про фильтрацию. Напрямую получаемые от пользователя данные вставлять нельзя - сломают сайт. Надо фильтровать, например intval, если число, заслешивать кавычки, чистить от хтмл-тегов.

Попробуйте пока всё же мой вариант
mysql_query('INSERT INTO `users` (avatar) VALUES ('.$a.') WHERE `name` = '.$login.' AND `pass` = '.$pass);



3. Откуда берутся значения $login и $pass? Они точно существуют?
Попробуйте вывести так
echo 'INSERT INTO `users` (avatar) VALUES ('.$a.') WHERE `name` = '.$login.' AND `pass` = '.$pass;

Всё на месте?

4. nasqad,
в натуре, надо UPDATE SET

micscr 02.05.2012 10:51

Цитата:

Сообщение от 9xakep
Как тогда добавить в БД данные, в нужный логин и пароль?

для изменения используется UPDATE
просто INSERT - для добавления новых записей.
Есть еще INSERT ... ON DUPLICATE. Если по ключу нет - добавит, иначе - изменит.

micscr 02.05.2012 11:03

Цитата:

if($_SERVER['REQUEST_METHOD']=='POST') senn2();

довольно странно выглядит. Делается на пыхе в общем так:
$ava = (isset($_POST['ava'])) ? $_POST['ava'] : false;
if ($ava) {
  $query = "UPDATE `users` SET `avatar`='%s' WHERE `name`='%s' AND `pass`='%s'";
  $query = sprintf($query, mysql_real_escape_string($ava), mysql_real_escape_string($login), mysql_real_escape_string($pass));
  $res = mysql_query($query);
  //...
}


ну конечно переменные $login, $pass должны где то сначала вычисляться.

9xakep 02.05.2012 11:55

Цитата:

Сообщение от Serg_pnz
3. Откуда берутся значения $login и $pass? Они точно существуют?
Попробуйте вывести так
echo 'INSERT INTO `users` (avatar) VALUES ('.$a.') WHERE `name` = '.$login.' AND `pass` = '.$pass;

Всё на месте?

$login и $pass беруться в самом начале, с помощью я захожу в аккаунт, вот сайт, введи в 1ое sdf, во 2ое we, и зайдешь.
Нет не все, логин и пароль от отсутствуют.ладно воспользуюсь советом micscr. Спасибо
============
Я кажется понял в чем проблема, я отправляю логин и пароль формой, на мою же страницу, после они теряются, может быть в этом проблема?
============
Можно ли на событие в js повесить ф-ию php? Я понимаю, что это бред, но все же?
============
micscr,
Написал так:
$ava = (isset($_POST['ava'])) ? $_POST['ava'] : 'false';  // false строкой сделал
echo 'ava is '.$ava; // false
if ($ava) {
echo $row['name'].'<hr>'.$row['pass'];
$query = "UPDATE `users` SET `avatar`='%s' WHERE `name`='%s' AND `pass`='%s'";
$query = sprintf($query, mysql_real_escape_string($ava), mysql_real_escape_string($row['name']), mysql_real_escape_string($row['pass']));
mysql_query($query);
}

И в БД все добавилось, получается, что от js ничего не приходит что ли? И ошибка не в php?

micscr 02.05.2012 14:42

Цитата:

// false строкой сделал
вообще то так неверно, такая строка преобразуется в Истину.

Цитата:

echo 'ava is '.$ava; // false
смотри в фаербаге, вкладка "Сеть", идет ли у тебя 'ava' в $_POST.

Аякс у тебя тоже подозрительный, попробуй:
r.send('ava='+ava) // что посылаем

9xakep 02.05.2012 14:50

micscr,
весь прикол в том, что он там всегда был О-о

А что подозрительного?

micscr 02.05.2012 15:05

Смотри как объект этот создается в справочнике:
http://javascript.ru/ajax/intro

ava is false у тебя не при посте же?

9xakep 02.05.2012 15:14

micscr,
В справочнике создает кроссбраузерный метод для осла, остальные браузеры нормально поддерживают ajax, и что бы открыть запрос, достаточно написать: var request = New XMLHttpRequest
1)
<input type='text' id='avatar'>
<input type='button' onclick='ava()' value='Установить аватар'>
<script>
function ava() {
var ava = document.getElementById('avatar').value
ava = encodeURIComponent(ava)
var r = new XMLHttpRequest; // создаем запрос
/* нам не нужно в js использовать ответ сервера, нам нужно просто послать, поэтому мы пропускаем: r.onredy....if(readyStage==4 && status == 200) */
r.open('POST', 'login.php', true) // открываем
r.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // устанавливаем заголовок
r.send('ava='+ava) // что посылаем
}
</script>

2)
Цитата:

Сообщение от micscr
ava is false у тебя не при посте же?

да
===========
сейчас сделал открыл запрос тем методом, что в справочнике, ничего не изменилось

micscr 02.05.2012 15:38

Цитата:

да
не при посте она естественно и будет false.
А при посте будет $_POST['ava'], т.е. все должно работать.
Если не работает то сразу надо искать ошибку в запросе
mysql_query($query) or die('Error:' . mysql_error());

просто этот текст ошибки, при аяксе, на вкладке Сеть, в полученных смотреть.

9xakep 02.05.2012 15:54

micscr,
ошибка вот в чем:
if ($ava) {
echo 'ava is '.$ava;
echo $row['name'].'<hr>'.$row['pass'];
$query = "UPDATE `users` SET `avatar`='%s' WHERE `name`='%s' AND `pass`='%s'";
$query = sprintf($query, mysql_real_escape_string($ava), mysql_real_escape_string($row['name']), mysql_real_escape_string($row['pass']));
mysql_query($query) or die('Error:' . mysql_error());
}

То есть при загрузки страницы, он по if проходит, и больше не затрагивает, то есть что-тов этом роде:
<input  type='text' id='text'>
<script>
document.getElementById('text').value == 1 ? alert('true') : alert('false')
</script>

То есть он не ждет пока там что-нибудь появиться, единственным решением, я вижу поставить это все в ф-ию и при post отправки ее вызывать?

micscr 02.05.2012 17:13

Цитата:

micscr,
ошибка вот в чем:
и в чем там ошибка? :blink:

Я тебя не понимаю, мне кажется тебе надо сначала поболее основы подтянуть.

9xakep 02.05.2012 19:40

micscr,
Ну вот пример из js:
<input type='text' id='a'>
<script>
var v = document.getElementById('a').value
if( v == 'asd' ) {
alert('something')
} else {
alert('else')
}
</script>

У нас никогда не будет if, почему, объяснять думаю не стоит, тоже у нас и в php, теперь понял, в чем проблема?

Serg_pnz 02.05.2012 21:44

Вообще не осиляю понять в чем проблема.
Дать юзеру аяксом загрузить авку? ну и грузите файл на здоровье, но! прежде, чем принять файл (да собственно любые другие данные) проверьте юзер ли отправил эти данные или нет? Сделать это можно, например, через сессии пхп.
9xakep, чего-то Вы себя перемудряете, имхо.

9xakep 02.05.2012 21:50

Serg_pnz,
так-с...мне вообще вот вся задача:
1) Заходит юзер со своим логином и паролем (готово, пост отправка формы, с перезагрузкой страницы)
2) В случае удачного захода появляется текстовое поле, куда надо вставить текст(ссылку авы) (как видишь, пока не выходит)
3) После эта ссылка добавляется в нужный столбец (пхп работает(в нужную строку добавляется) Но вот с аяксом проблемы)
-------------
В общем завтра попробую с пустой страницы потренироваться( текстовое поле, нужно инфо оттуда отправить в БД с помощью ajax)

Serg_pnz 03.05.2012 10:14

Ну я так и подумал, что проблема с поддержанием аутентификации.
Тут или на сессиях или куках надо делать.
И да - посмотреть бы все файлы.
На jquery сделал бы подобное на раз-два (ну больше я пхп, нежели js-программист)

9xakep 03.05.2012 10:27

Serg_pnz,
не хочу использовать jquery, внутренне отторжение к нему) Хочу на чистом js писать. Хотя знаю, что там это все делается без геморроя
=========
Сейчас прочитал про сессии(написано: При использовании сессий данные сохраняются во временных файлах на сервере.), вопрос: насколько они сохраняются?

9xakep 03.05.2012 10:29

Цитата:

Сообщение от Serg_pnz
И да - посмотреть бы все файлы.

если хочешь весь код увидеть, пожалуйста:
<body>
<form action='login.php' method='POST'>
<input type='text' value='<?php echo $_POST['login'] ?>' name='login'>
<input type='text' name='pass' value='<?php echo $_POST['pass'] ?>' >
<input type='submit' value='Зайти'>
</form></body>
<?php 
function senn() {
$login = $_POST['login'];
$pass = $_POST['pass'];
$conn = mysql_connect('localhost', 'gmoryes_login', '*********');
if(mysql_select_db('gmoryes_login', $conn))
{
	$res = mysql_query("SELECT `name`,`pass` FROM `users` WHERE `name` = '$login' AND `pass` = '$pass'");
	$row = mysql_fetch_assoc($res); 
		if($row['name']!='' && $row['pass']!= '')
		{
			if($row['avatar']!='')
			{
			echo "у вас уже есть аватар, это: ".$row['avatar'];
			}
		else {  
			echo "
			<script>
 			document.body.innerHTML = ''
			</script>
			";
			echo "
			<input type='text' id='avatar'>
			<input type='button' onclick='ava()' value='Установить аватар'>
			<script>
			function ava() {
			var ava = document.getElementById('avatar').value
			ava = encodeURIComponent(ava)
			var r = new XMLHttpRequest(); // создаем запрос
			r.open('POST', 'login.php', true) // открываем
			r.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // устанавливаем заголовок
			r.send('ava='+ava) // что посылаем
			}
			</script>
			";
			function s(){
			$ava = (isset($_POST['ava'])) ? $_POST['ava'] : false;
			
			if ($ava) {
			echo 'ava is '.$ava;
			echo $row['name'].'<hr>'.$row['pass'];
  			$query = "UPDATE `users` SET `avatar`='%s' WHERE `name`='%s' AND `pass`='%s'";
  			$query = sprintf($query, mysql_real_escape_string($ava), mysql_real_escape_string($row['name']), mysql_real_escape_string($row['pass']));
		 	mysql_query($query) or die('Error:' . mysql_error());
  			}	
			else {
			echo 'else';
			}
			}
			if($_SERVER['REQUEST_METHOD']=='POST') s();
		     }
		}
}
}
if($_SERVER['REQUEST_METHOD']=='POST') senn();
?>

micscr 03.05.2012 11:12

о жизни сессии

код конечно... :) . Старайся сразу отделять логику от вывода. js файлы отдельно должны идти.

Не работает потому что при аяксе ты не передаешь
$login = $_POST['login'];
$pass = $_POST['pass'];


и включи в php.ini
error_reporting = E_ALL
, много полезного будешь видеть

9xakep 03.05.2012 13:23

micscr,
Цитата:

Сообщение от micscr
код конечно...

поверь это еще не самый) А вообще это пока только первые php скрипты, в будущем надеюсь будет лучше :)
Цитата:

Сообщение от micscr
Не работает потому что при аяксе ты не передаешь
$login = $_POST['login'];
$pass = $_POST['pass'];

так я же их не при аяксе передавал, это я принимал формой
Цитата:

Сообщение от micscr
и включи в php.ini
error_reporting = E_ALL
, много полезного будешь видеть

погуглил, оказывается мой хостинг, как я понял не предоставляет возожности редактировать php.ini :(

micscr 03.05.2012 15:06

функцией уровень ошибок можно выставить:
http://php.net/manual/en/function.error-reporting.php

да, у тебя там вообще чепуха. В функции s() вот этому:
$row['name']
неоткуда взяться. В пыхе переменные сами не ищутся выше, как в js.
По идее надо сделать
function s($name, $pass)
, а эти данные при аякс запросе, в скрипте неоткуда брать. Ты их не передаешь.

Serg_pnz 04.05.2012 13:42

micscr,
:yes:

9xakep,
тут запроси id юзера в базе и пихни его в сессию
$res = mysql_query("SELECT `name`,`pass` FROM `users` WHERE `name` = '$login' AND `pass` = '$pass'");


А позже сделаешь отбор по id, хранящегося в сессии
"UPDATE `users` SET `avatar`='%s' WHERE `id`=".$_SESSION['user_id'];

9xakep 04.05.2012 18:53

micscr,
Serg_pnz,
спасибо за советы, обязательно воспользуюсь :)
Но пока решил потренироваться, и не могу понять в чем проблема, точнее как правильно сделать, задача:
передать данные с текстового поля, на эту же страницу с помощью ajax:
[php]
<?php 
echo "
<input type='text' value='' id='text'><input type='button'  onclick='send()' value='send'>
<script>
function send() {
var text = document.getElementById('text').value
var r = new XMLHttpRequest;
r.open('GET', 'ex-1.php?text='+encodeURIComponent(text), true)
r.send(null)
}
</script>
";
$text = $_GET['text'];
echo $text;
?>
[/php]
[IMG]http://s019.radikal.ru/i616/1205/8f/7e0bff4880e6.png[/IMG]
[IMG]http://s019.radikal.ru/i643/1205/d3/f323295d027a.png[/IMG]
Данные отправляются, и по 2ому скриншоту видно, что они приходят(или я не прав?), но на страницу они не добавляются, что не так-то? :-E

Ура!!! У меня получилось :D :D
<?php 
$con = mysql_connect('localhost', 'gmoryes_login', '****');
mysql_select_db('gmoryes_login', $con);
echo "
<input type='text' value='' id='text'><input type='button'  onclick='send()' value='send'>
<script>
function send() {
var text = document.getElementById('text').value
var r = new XMLHttpRequest;
r.open('GET', 'ex-1.php?text='+encodeURIComponent(text), true)
r.send(null)
}
</script>
";
$text = $_GET['text'];
mysql_query("INSERT INTO `users` (avatar) VALUES ('$text')");
?>

9xakep 04.05.2012 21:02

Почему ничего не выводит?
<?php 
error_reporting(E_ALL); // докладываем обо всех ошибках, спасибо микскр
echo "
Введите свой логин: <input type='text' value='' id='login'><br>
Введите свой пароль: <input type='text' id='pass'><br>
<input type='button' value='Войти' onclick='logIn()'>
<script>
function logIn() {
var login = document.getElementById('login').value
login = encodeURIComponent(login)
var pass = document.getElementById('pass').value
pass = encodeURIComponent(pass)
var r = new XMLHttpRequest;
r.open('GET', 'login.php?login='+login+'&pass='+pass, true)
r.send(null)
}
</script>
";
$connect = mysql_connect('localhost', 'gmoryes_login', '*****'); // заходим
$login = (isset($_GET['login'])) ? $_GET['login'] : false; // проверяем есть логин и пароль(отправлены ли они)
$pass = (isset($_GET['pass'])) ? $_GET['pass'] : false;
mysql_select_db('gmoryes_login', $connect); // конектимся к таблице
if($login) {
if($pass) {
$res = mysql_query("SELECT `name`, `pass` FROM `users` WHERE `name` = '$login' AND `pass` = '$pass'");
$res = mysql_fetch_assoc($res);
if($res['name']!='' && $res['pass']!= '') {
echo '<b>good</b>'; // почему это не попадет на страницу??
} else {
echo '<b>bad</b>'; // и это тоже? 
}
}
}
?>

Что надо написать? Поскольку в ответе от сервера все в порядке(не считая проблем с кодировками)

micscr 05.05.2012 09:24

Цитата:

// почему это не попадет на страницу??
// и это тоже?
Ну смотри что ты делаешь:
1) запрашиваешь страницу. Если в адресной строке нет ни login ни pass, то то, что в цитате не выводится.
2) ты вводишь данные в поля и жмешь кнопку. Но ты забыл поставить обработчик r.onreadystatechange, в котором обработаешь ответ, который на картинке. Естественно в этом ответе html тот не нужен, а только 'good' или 'bad'.

AJAX - это уже на загруженной странице, js запросил данные с сервера и обработав полученный ответ, что то сделал, изменил dom, например.

И насчет твоего sql-запроса, такие вещи решаются запросами вида:
select count(*) from users where ...
и проверяется полученное число, 0 или более.

9xakep 05.05.2012 09:43

micscr,
даже если я его ставлю, он пишет Undefined :blink:
<?php 
error_reporting(E_ALL);

echo "
Введите свой логин: <input type='text' value='' id='login'><br>
Введите свой пароль: <input type='text' id='pass'><br>
<input type='button' value='Войти' onclick='logIn()'>
<script>
function logIn() {
var login = document.getElementById('login').value
login = encodeURIComponent(login)
var pass = document.getElementById('pass').value
pass = encodeURIComponent(pass)
var r = new XMLHttpRequest; // создать запрос
r.onreadystatechange = function () {   
if(r.readyState==4 && r.status == 200) {
alert(r.responceText) // выводит undefined??
}
}
r.open('GET', 'login.php?login='+login+'&pass='+pass, true)
r.send(null)
}
</script>
";
$connect = mysql_connect('localhost', 'gmoryes_login', 'mishan11235');  // конектимся к БД
$login = (isset($_GET['login'])) ? $_GET['login'] : false;
$pass = (isset($_GET['pass'])) ? $_GET['pass'] : false;
mysql_select_db('gmoryes_login', $connect); // выбираем таблицу
if($login) {
if($pass) {
$res = mysql_query("SELECT `name`, `pass` FROM `users` WHERE `name` = '$login' AND `pass` = '$pass'");
$res = mysql_fetch_assoc($res);
if($res['name']!='' && $res['pass']!= '') {
echo "good"; // все, это на странице не выводиться!
} else {
echo "bad"; // как и это!
}
}
}
?>

micscr 05.05.2012 09:51

Цитата:

alert(r.responceText)
responseText

9xakep 05.05.2012 10:05

*facepalm*...., спасибо, все работает
=========
Теперь вроде понял принцип работы c ajax :) Кстати, что нужно сделать, чтобы в ответе не было вот этого: "������� ���� �����" ? Это проблема сервера или клиента? Прописал: header("Content-type: text/html; charset=windows-1251");. Все ок.

9xakep 05.05.2012 13:02

micscr,
Хей..получилось)
Страница регистрации: link
Страница авторизации: link
При повторном заходе, он берет из сессии логин)


Часовой пояс GMT +3, время: 12:35.