2012-10-10 126 views
0

我試圖讓我很容易地使用jquery從php/mysql請求json輸出。現在我正在使用下面的內容。誰能推薦一個更好的方法?php輸出json

/do.php?username=bob

<?php 
    $str = $_SERVER['QUERY_STRING']; 
    if($str != ''){ 
     if(preg_match("/username/",$str)){ 
      parse_str($str); 
      $json = json_encode(checkUserName($username)); 
      echo $json; 
     } 
    } 
    function checkUserName($v){ 
     $db = new DB(); 
     $db->connectDB(); 

     $findUsername = mysql_query("SELECT COUNT(*) FROM user WHERE username = '$v'"); 
     $countUser = mysql_fetch_row($findUsername); 
     if($countUser[0] < 1){ 
      return array('username' => 'false'); 
     }else{ 
      return array('username' => 'true'); 
     } 

     $db->disconnectDB(); 
    } 
?> 

我得到一個乾淨的{ '用戶名': '假'}或{ '用戶名': '真'}這適用於我所需要的;但是PHP有沒有更好的方法來做到這一點?

哇 - 驚人的答案!我甩我的老DB類,取而代之的是:

<?php 
    function db_connect(){ 
    $dbh = new PDO("mysql:host=localhost;dbname=thisdb", "dbuser", "dbpass"); 
    return ($dbh); 
    } 
?> 

然後在我的do.php腳本我做了這個變化:

<?php 
    if(isset($_GET['username'])){ 
    header('content-type: application/json; charset=UTF-8'); 
    echo json_encode(checkUserName($_GET['username'])); 
    } 

    function checkUserName($v){ 
    $dbh = db_connect(); 
    $sql = sprintf("SELECT COUNT(*) FROM user WHERE username = '%s'", addslashes($v)); 
    if($count = $dbh->query($sql)){ 
     if($count->fetchColumn() > 0){ 
     return array('username'=>true); 
     }else{ 
     return array('username'=>false); 
     } 
    } 
    } 
?> 

和我的jQuery是:

function checkUserName(str){ 
    $.getJSON('actions/do.php?username=' + str, function(data){ 
    var json = data; 
    if(json.username == true){ 
     // allowed to save username 
    }else{ 
     // not allowed to save username 
    } 
    }); 
} 
+1

'$ db-> disconnectDB();'無法訪問。 – Musa

+1

'DB'類在哪裏? –

+1

請修復SQL注入漏洞 - 請參閱http://stackoverflow.com/questions/60174/best-way-to-prevent-sql-injection-in-php(並且最好切換到使用mysqli_ *或pdo而不是過時的mysql_ *函數)。 –

回答

1
$str = $_SERVER['QUERY_STRING']; 
if($str != ''){ 
    if(preg_match("/username/",$str)){ 
     parse_str($str); 
     $json = json_encode(checkUserName($username)); 
     echo $json; 
    } 
} 

通過使用$_GET超全局:這可以寫得更容易:

if (isset($_GET['username'])) { 
    echo json_encode(checkUserName($_GET['username'])); 
} 

checkUserName()

$findUsername = mysql_query("SELECT COUNT(*) FROM user WHERE username = '$v'"); 

你應該逃避$v正確:

$sql = sprintf("SELECT COUNT(*) FROM user WHERE username = '%s'", mysql_real_escape_string($v)); 
$findUsername = mysql_query($sql); 

更重要的是,學習PDO /庫MySQLi和使用準備好的語句。

$db->disconnectDB(); 

除非您使用持續連接,否則不需要此語句。如果你這樣做,你應該將返回值保存在一個變量中,並且只在斷開後返回。

1

我不知道你的DB類是什麼,但看起來更漂亮。

<?php 

function checkUserName($v){ 
    $db = new DB(); 
    $db->connectDB(); 

    $findUsername = mysql_query("SELECT COUNT(*) FROM user WHERE username = '$v'"); 
    $countUser = mysql_fetch_row($findUsername); 
    $db->disconnectDB(); // no code after "return" will do effect 

    return ($countUser[0] != 0); // returning a BOOL true is better than a string "true" 
} 

// use addslashes to prevent sql injection, and use isset to handle $_GET variables. 
$username = isset($_GET['username']) ? addslashes($_GET['username']) : ''; 

// the above line is equal to: 
// if(isset($_GET['username'])){ 
//  $username = addslashes($_GET['username']); 
// }else{ 
//  $username = ''; 
// } 

echo json_encode(checkUserName($username)); 

?> 
0

如果你想有一個修復只是這一個取代你checkUsername功能:

function checkUserName($v){ 
    $db = new DB(); 
    $db->connectDB(); 

    $findUsername = mysql_query("SELECT username FROM user WHERE username = '$v' LIMIT 1"); 

    if(mysql_num_rows($findUsername)) 
    return array('username' => mysql_result($findUsername,0)); 
    else 
    return array('username' => 'false'); 

} 

還是一個simplier方式:

if(isset($_GET['username'])){ 

    $db = new DB(); 
    $db->connectDB(); 

    $query = mysql_query(sprintf("SELECT username FROM user 
          WHERE username='%s'", 
          mysql_real_escape_string($_GET['username']) 
         ); 

    if(mysql_num_rows($query)) 
     $json = array('username'=>mysql_result($query,0)); 
    else 
     $json = array('username'=>false); 

    header('content-type:application/json'); 
    echo json_encode($json); 
    } 
0

通過自己的方式,如果你要處理的json的數據在jquery你可以這樣做

$.ajax({ 
      type:"POST", 
      data:'username=bob', 
      url: "do.php", 
      success: function(jsonData){ 
       var jsonArray = eval('(' + jsonData + ')'); 

       if(jsonArray.username == 'true'){ 
        // some action here 
       }else if((jsonArray.username == 'false')){ 
        // someother action hera 
       } 



      } 
     },"json"); 
+0

我有jQuery使用$ .getJSON() – jbolanos