2014-07-03 34 views
0

我正在構建一個小php應用程序,您可以添加人員然後在頁面上看到他們。當我簡單地添加它時沒有問題,但是後來我開始使用一個開關,現在它無法添加或檢索。我在語法中看不到任何問題,任何人都可以看到錯誤?添加和檢索到mysql

PHP

<?php 

$con = mysql_connect("hostWasHere","username","password"); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 

mysql_select_db("dbIsHere", $con); 

try{ 

    switch($_POST['action']) 
    { 
     case 'retrieve': 
      $show=mysql_query("Select * from test",$con); 

    while($row=mysql_fetch_array($show)){ 
     echo "<li><b>$row[firstName]</b> : $row[lastName]</li>"; 
    } 
     mysql_close($con); 
      break; 

     case 'new': 
      $sql="INSERT INTO test (firstName, lastName) 
VALUES 
('$_POST[fname]','$_POST[lname]')"; 

if (!mysql_query($sql,$con)) 
    { 
    die('Error: ' . mysql_error()); 
    } 
echo "1 record added"; 

mysql_close($con); 
      break; 
    } 

} 




?> 

JavaScript的使用是這樣的:

function saveToServer() { 
alert("clicked"); 
$.post("api.php", { 
     'action': "new", 
     'fname': $('#fname').val(), 
     'lname': $('#lname').val() 
    }, 
    function() { 
     alert("succes"); 
    } 
); 

} 

function getFromServer() { 
    console.log("in get!"); 
    $.ajax({ 
    type: "post", 
    url: "api.php", 
    data: "action=retrieve", 
    success: function (data) { 
     $("#comment").html(data); 
     console.log("success!"); 
    } 
    }); 

} 
+1

'它不起作用'會發生什麼?顯示任何錯誤? – Sugar

+1

將錯誤報告添加到文件頂部 'error_reporting(E_ALL); ini_set('display_errors',1);' - 另外,你現在的代碼是打開[** SQL注入**](http://stackoverflow.com/q/60174/)。使用[**'mysqli_ *'和準備好的語句**](http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php)或[** PDO **](http ://php.net/pdo)與[** prepared statements **](http://php.net/pdo.prepared-statements)。 –

+1

縮進代碼,它經常會顯示明顯的錯誤。不要使用mysql_ *,因爲它已被棄用,將來不會被支持。使用預先準備的語句,某人(任何人)只需花費1分鐘的時間研究如何刪除數據庫。開發人員工具中是否存在任何錯誤? – Jonast92

回答

1

您使用的是try塊沒有任何catchfinally - 這是行不通的。最有可能的是,你的服務器被配置爲不輸出任何錯誤,所以它靜靜地死去。

其他一些言論:

  • 正如在評論中指出,請使用PDO或庫MySQLi而不是MySQL的過時類的。

  • 注意SQL注入並始終正確地進行消毒,沒有藉口。 (我與PDO下面的代碼使用prepare並注意到了這一問題。)當你訪問數組的一個字符串作爲關鍵

  • 使用引號:$_POST['fName']$row["lName"],而不是$row[lName]

  • 輸出全部錯誤,當您通過在您的文件的頂部添加error_reporting(E_ALL)開發您的頁面。請注意,服務器設置可能仍會抑制錯誤輸出,但這通常會處理所有事情。

  • 使用帶有大量代碼的switch聲明絕不是一個好主意;您希望將所有代碼保留在相當輕的位置,或者切換到if,else ifelse的組合。


少廢話。這是我的頁面編輯,使用PDO而不是已棄用的MySQL系列。

<?php 
error_reporting(E_ALL); 

// PDO has more options to read about 
// for initialization, but this should do for now 
$con = new PDO("host=host;dbname=db_here", "username", "password"); 

if (!$con) { 
    die('Could not connect: !'); 
} 

// Do some validation on $_POST before using it. 
$action = ''; 
if(isset($_POST['action'])) { 
    $action = $_POST['action']; 
} 

if($action == 'retrieve') { 
    $sql = $con->execute('SELECT * FROM test'); 
    $rows = $sql->fetchAll(PDO::FETCH_ASSOC); 

    foreach($rows as $row) { 
     echo '<li><b>'.$row['firstName'].'</b> : '.$row['lastName'].'</li>'; 
    } 
    $con = null; 
} 
else if($action == 'new') { 
    $sql = $con->prepare('INSERT INTO test (firstName, lastName) 
          VALUES (?, ?)'); 

    // TODO: more checks on fname and lname before accepting 
    if(isset($_POST['fname']) || isset($_POST['lname'])) { 
     $result = $sql->execute(array($_POST['fname'], $_POST['lname'])); 
     if(!$result) { 
      die('Error occured'); 
     } 
     else { 
      echo 'Added 1 row'; 
     } 
    } 

    $con = null; 
} 
else { 
    // TODO: Default page 
} 

PS:請永遠不要相信用戶的輸入。該代碼仍然插入$_POST值而不是盲目(只檢查他們至少設置),進一步檢查與is_scalar()和一些長度檢查可能會很好。

我希望這可以幫助 - 與您的項目祝你好運!

+0

非常感謝你,這不僅僅是一個很好的例子,而且你的筆記對我來說都很有幫助。我同意你提出的每一個觀點,至於交換機中的大量代碼,我最終會用它自己的方法創建一個類,然後在那裏調用它們。對於用戶輸入,我會在我認爲的前端進行所有檢查,但是再次提供很好的提示 – user3479297