Передача переменной из 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 То есть запрос отправляется нормально, но в пхп странная проблема, где? В БД ничего не появляется? |
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); Обратите внимание, что данные надо фильтровать перед вставкой. |
Serg_pnz,
так чтоли: mysql_query("INSERT INTO `users` WHERE `name`=".$login."AND `pass`=".$pass."(avatar) VALUES (".$a.")") P.S. просто учился по одному уроку, там так было |
9xakep,
я ж вроде написал во второй строке... |
Цитата:
Цитата:
Цитата:
Цитата:
|
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 |
Цитата:
просто INSERT - для добавления новых записей. Есть еще INSERT ... ON DUPLICATE. Если по ключу нет - добавит, иначе - изменит. |
Цитата:
$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 должны где то сначала вычисляться. |
Цитата:
Нет не все, логин и пароль от отсутствуют.ладно воспользуюсь советом 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? |
Цитата:
Цитата:
Аякс у тебя тоже подозрительный, попробуй: r.send('ava='+ava) // что посылаем |
micscr,
весь прикол в том, что он там всегда был О-о ![]() А что подозрительного? |
Смотри как объект этот создается в справочнике:
http://javascript.ru/ajax/intro ava is false у тебя не при посте же? |
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) Цитата:
=========== сейчас сделал открыл запрос тем методом, что в справочнике, ничего не изменилось |
Цитата:
А при посте будет $_POST['ava'], т.е. все должно работать. Если не работает то сразу надо искать ошибку в запросе mysql_query($query) or die('Error:' . mysql_error()); просто этот текст ошибки, при аяксе, на вкладке Сеть, в полученных смотреть. |
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,
Ну вот пример из js: <input type='text' id='a'> <script> var v = document.getElementById('a').value if( v == 'asd' ) { alert('something') } else { alert('else') } </script> У нас никогда не будет if, почему, объяснять думаю не стоит, тоже у нас и в php, теперь понял, в чем проблема? |
Вообще не осиляю понять в чем проблема.
Дать юзеру аяксом загрузить авку? ну и грузите файл на здоровье, но! прежде, чем принять файл (да собственно любые другие данные) проверьте юзер ли отправил эти данные или нет? Сделать это можно, например, через сессии пхп. 9xakep, чего-то Вы себя перемудряете, имхо. |
Serg_pnz,
так-с...мне вообще вот вся задача: 1) Заходит юзер со своим логином и паролем (готово, пост отправка формы, с перезагрузкой страницы) 2) В случае удачного захода появляется текстовое поле, куда надо вставить текст(ссылку авы) (как видишь, пока не выходит) 3) После эта ссылка добавляется в нужный столбец (пхп работает(в нужную строку добавляется) Но вот с аяксом проблемы) ------------- В общем завтра попробую с пустой страницы потренироваться( текстовое поле, нужно инфо оттуда отправить в БД с помощью ajax) |
Ну я так и подумал, что проблема с поддержанием аутентификации.
Тут или на сессиях или куках надо делать. И да - посмотреть бы все файлы. На jquery сделал бы подобное на раз-два (ну больше я пхп, нежели js-программист) |
Serg_pnz,
не хочу использовать jquery, внутренне отторжение к нему) Хочу на чистом js писать. Хотя знаю, что там это все делается без геморроя ========= Сейчас прочитал про сессии(написано: При использовании сессий данные сохраняются во временных файлах на сервере.), вопрос: насколько они сохраняются? |
Цитата:
<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(); ?> |
о жизни сессии
код конечно... :) . Старайся сразу отделять логику от вывода. js файлы отдельно должны идти. Не работает потому что при аяксе ты не передаешь $login = $_POST['login']; $pass = $_POST['pass']; и включи в php.ini error_reporting = E_ALL , много полезного будешь видеть |
micscr,
Цитата:
Цитата:
Цитата:
|
функцией уровень ошибок можно выставить:
http://php.net/manual/en/function.error-reporting.php да, у тебя там вообще чепуха. В функции s() вот этому: $row['name'] неоткуда взяться. В пыхе переменные сами не ищутся выше, как в js. По идее надо сделать function s($name, $pass) , а эти данные при аякс запросе, в скрипте неоткуда брать. Ты их не передаешь. |
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']; |
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')"); ?> |
Почему ничего не выводит?
<?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>'; // и это тоже? } } } ?> Что надо написать? Поскольку в ответе от сервера все в порядке(не считая проблем с кодировками) ![]() |
Цитата:
1) запрашиваешь страницу. Если в адресной строке нет ни login ни pass, то то, что в цитате не выводится. 2) ты вводишь данные в поля и жмешь кнопку. Но ты забыл поставить обработчик r.onreadystatechange, в котором обработаешь ответ, который на картинке. Естественно в этом ответе html тот не нужен, а только 'good' или 'bad'. AJAX - это уже на загруженной странице, js запросил данные с сервера и обработав полученный ответ, что то сделал, изменил dom, например. И насчет твоего sql-запроса, такие вещи решаются запросами вида: select count(*) from users where ... и проверяется полученное число, 0 или более. |
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"; // как и это! } } } ?> |
Цитата:
|
*facepalm*...., спасибо, все работает
========= Теперь вроде понял принцип работы c ajax :) |
|
Часовой пояс GMT +3, время: 12:35. |