2013-02-10 2 views
-1

Я попытался сделать простой возврат mysql на той же странице после ввода идентификатора в поле html.Как читать данные json в perl, отправленные через ajax/jquery?

Я отправил его через ajax в perl-скрипт, который должен выполнить поиск в базе данных и получить результат имени.

Я искал в Интернете пробовал разные варианты, но я не мог найти правильный ответ за то, что я ищу.

Я пытаюсь получить номер id, отправив его в базу данных и получив имя этого контакта id.

Вот мой HTML код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<HTML xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<script language="javascript" type="text/javascript"> 
var xmlHttp = new XMLHttpRequest(); 
</script> 
<META charset="utf-8"> 
<TITLE>Ajax-tool</TITLE> 
</head> 

<body> 
<form id="procform" name="procform" method="POST" action=""> 
<b>Contact ID:</b> 
<fieldset> 
<input type="text" id="CID" name="CID" size="20" /> 
<p><input type="submit"></p> 
</fieldset> 
</form> 
<p></p> 
<div id="content"></div> 

<SCRIPT type="text/javascript" src="/js/jquery.js"></SCRIPT> 
<SCRIPT type="text/javascript" src="js/jquery-ui.min.js"></SCRIPT> 
<SCRIPT type="text/javascript" src="/js/ajax01.js"></SCRIPT> 
</body> 
</HTML> 

Сценарий JQuery:

$(document).ready(function() { 
    $("form#procform").submit(function() { 
    var id = $("#CID").val(); 
    var jsondata = { 'CID' : id }; 
     $.ajax({ 
      type: "POST", 
      url: "http://192.168.10.1/cgi-bin/ajax01.pl", 
       async: false, 
       contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      data: {CID: id}, 
      success: function(result) { 
       $("div#content").text("data.success: " + data); 
       //alert(data); 
      }, 
      error: function (request, status, error) { 
       alert(request.responseText); 
      } 
     }); 
//alert(+ id + ""); 
    }); 
}); 

И Perl скрипт:

#!/usr/bin/perl -T 


use CGI ":all"; 
use DBI; 
#use strict; 
use warnings; 
use Encode; 
use JSON; 
use Storable; 
#$foo = CGI->new; 



#$foo->charset('utf-8'); 
$json = JSON->new->allow_nonref; 

$dbh = DBI->connect('mylogin) 
       || die "Could not connect to database: $DBI::errstr"; 
#my $cidID = CGI->new->param('CID'); 


my $cidID = $json->decode('CID'); 
#my $cidID = $foo->param('CID'); 
#$cidID = 44; 

######### select contact name from contacts ############## 
$sth0 = $dbh->prepare("SELECT * FROM contacts WHERE cid= $cidID")or "can't prepare : $DBI::errstr\n"; 

$sth0->execute()or die "Can't execute: $DBI::errstr\n"; 

@row0 = $sth0->fetchrow_array; 

my $VCName3 = $row0[1]; 

$sth0->finish(); 
print $VCName3; 

my $json1 = $json->encode($VCName3); 

print $foo->header(-type => "application/json", -charset => "utf-8"); 
print $json1; 

Если я даю cidID значение внутри Perl сценарий и удалить все определение главы для json, я получаю правильный результат для cidID.

Но проблема в том, чтобы получить правильные данные в cidID из ajax.

UPDATE

Я новичок здесь, так что я не знаю, если удалить часть выше, или оставить его для других, чтобы узнать ..

however- я сделал второй взгляд на веб и сделал некоторые изменения в код, как в ПРИМЕР-

в AJAX я изменил метод из «POST» в «GET»

сейчас он работает, я не знаю, почему он не работает с POST , есть идеи?

, но когда я хочу отобразить результат в DIV, он мгновенно вспыхивает и не остается там.

и есть ли способ вернуть результат в переменной для дальнейшего использования в jquery? i попытался -

var result = $(data.userid); 

без каких-либо успехов.

вот коды, как они работы-

HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<HTML xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<script language="javascript" type="text/javascript"> 
var xmlHttp = new XMLHttpRequest(); 
</script> 
<META charset="utf-8"> 
<TITLE>Ajax-tool</TITLE> 
</head> 

<body> 

<form id="procform" name="procform" method="POST" action=""> 
<b>Contact ID:</b> 
<fieldset> 
<input type="text" id="CID" name="CID" size="20" /> 
<p><input type="submit"></p> 
</fieldset> 
<p></p> 
<div id="content"></div> 
</form> 
<SCRIPT type="text/javascript" src="http://192.168.10.1/js/jquery.js"></SCRIPT> 
<SCRIPT type="text/javascript" src="http://192.168.10.1/js/jquery-ui.min.js"></SCRIPT> 
<SCRIPT type="text/javascript" src="http://192.168.10.1/js/ajax01.js"></SCRIPT> 
</body> 
</HTML> 

Jquery

$(document).ready(function() { 
    $("form#procform").submit(function() { 
    var id = $("#CID").val(); 
    var jsondata = { 'CID' : id }; 
     $.ajax({ 
      type: "GET", 
      url: "http:/cgi-bin/ajax01_1.pl", 
       async: false, 
       contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      data: "CID=" + id, 
      success: function(data) { 
       $("div#content").append("Name: " + data.userid); 
       //alert("Name: " + data.userid); 
      }, 
      error: function (request, status, error) { 
       alert(request.responseText); 
      } 
     }); 
    }); 
}); 

PERL

use DBI; 
use strict; 
use warnings; 
use Encode; 
my $foo = CGI->new; 
my $cidID = $foo->param("CID"); 

my $dbh = DBI->connect('here goes my login passw ect..') 
       || die "Could not connect to database: $DBI::errstr"; 

my @row0; 
######### select contact name from contacts ############## 
my $sth0 = $dbh->prepare("SELECT * FROM contacts WHERE cid= ?")or "can't prepare : $DBI::errstr\n"; 

$sth0->execute($cidID)or die "Can't execute: $DBI::errstr\n"; 

@row0 = $sth0->fetchrow_array; 

my $VCName3 = $row0[1]; 

$sth0->finish(); 
print $VCName3; 

my $json1 = ($VCName3)? 
    qq{{"success" : "login is successful", "userid" : "$VCName3"}} : 
    qq{{"error" : "username or password is wrong"}};; 

print $foo->header(-type => "application/json", -charset => "utf-8"); 
print $json1; 

ответ

6

Ваш сценарий Perl полон странности.Я бы рекомендовал исправить эти странности, прежде чем задаться вопросом, может ли быть проблема.

  1. use strict. Шутки в сторону. Это укажет на множество источников ошибок. И это заставляет вас объявлять ваши переменные (с my). Это хорошая вещь.
  2. uncomment $foo = CGI->new, т.к. вы фактически использование этот объект позже. Но для этого переменная действительно должна быть инициализирована объектом. Также переименуйте его в нечто разумное и объявите переменную: my $cgi = CGI->new;. → monumental CGI docs
  3. Вы забыли процитировать около 'mylogin.
  4. О, и пока вы находитесь die ing: Если вы умрете, это сообщение об ошибке попадет в ваши журналы. Эта программа приведет к еще большему количеству ошибок, поэтому вам нужно было бы собрать довольно много записей. Посмотрите на них, возможно, и устраните проблемы! Кроме того, вы можете отправить ошибки в браузер во время разработки. Сделайте это с помощью use CGI::Carp qw/fatalsToBrowser/;. → CGI::Carp documentation
  5. Прочитано JSON documentation. Убедитесь, что decode, а не decode_json - это то, что вы действительно хотите (decode_json предполагает UTF-8). Оба метода требуют строку JSON. Строка Perl my $not_json = q/CID/ is не действительный JSON. Это будет my $json = q/"CID"/. См. Цитаты?
  6. Я все еще предполагаю, что вы хотите прочитать параметр из запроса POST или GET. Как только вы будете следовать намеку № 2, это должно снова работать.
  7. Я не знаю SQL, но я знаю, что вы делаете это неправильно. Никогда не интерполировать переменные в SQL-запрос, или вы используете , приглашая инъекционных атак! Используйте параметризованные операторы: my $sth = $dbh->prepare('SELECT * FROM contacts WHERE cid = ?') or die ..., затем выполните его с фактической переменной как параметр $sth->execute($cidID) or die ....
  8. $sth->fetchrow_array выборки только одной строки, но вы выбрали все строк. Либо исправьте свой SQL, чтобы выбрать только первую строку, либо цикл по всем строкам! while (my @row = $sth->fetchrow_array){ do something @row }. → DBI docs
  9. Вы, print $VCName3, прежде чем печатать заголовки! Вероятно, это приведет к возникновению многих ошибок 500. Не делай этого.
  10. Вы указываете, что ваш JSON отправлен как UTF-8. Возможно, вы должны использовать encode_json.

[Insert шутка о десяти заповедях здесь]

После устранили проблему, проблема может и не остаться. Если да, обновите свой вопрос и оставьте комментарий, который вы сделали. Мы посмотрим, как мы можем решить те актуальные проблемы.

+3

Действительно, 'use strict' является * существенным *. Единственная причина, по которой она не включена по умолчанию, заключается в том, чтобы не нарушать огромное количество устаревшего кода: она обязательна для чего-либо нового. – Borodin

+0

благодарит за вас быстрый и подробный ответ, я сделал обновление вопроса, спасибо за любую дальнейшую помощь! – Michael

+0

+1 для параметризованных операторов SQL. – dgw

Смежные вопросы