2016-12-05 47 views
0

我有一個iOS應用程序使用Swift 3使用PHP文件來接收對象,但現在正在將對象更新到數據庫中。正確的PHP代碼? - 插入到MySQL

我是PHP新手,所以我的問題是,下面的PHP代碼是否正確?它應該從我的應用程序插入一個變量,這是從一個按鈕+1點通過PHP和UPDATE我的'測試'表在MySQL數據庫。我已經在數據庫中有一個名爲testPop的列,變量也稱爲testPop,它在json對象數組中被接收,但我只是試圖更新表。

所以,如果row1 = id:1 testName:test1 testPop:0

我想testPop更新它的值每次某人增加了一個點+1

當前PHP代碼:

<?php 

$host = "host"; 
$db = "db"; 
$user = "user"; 
$pass = "pass"; 

$connection = mysql_connect($host,$user,$pass); 

// Guessing: Posting into MySQL Object 
$id = $_POST["id"]; 

// Checking if connection can be established 
if(!$connection){ 
    die("Connection Failed"); 
} 
else 
{ 
    // Selecting Database 
    $dbconnect = mysql_select_db($db, $connection); 

    // Check if it can connect to Database 
    if(!$dbconnect){ 
     die("Unable to connect to Database"); 
    } 
    else 
    { 
     $query = sprintf("UPDATE tests SET testPop=testPop+1 WHERE id = %d", $id); 

     $resultset = mysql_query($query, $connection); 

     echo "Successfully added"; 
     echo $query; 
    } 
} 

?> 

斯威夫特3代碼:將數據發送到數據庫:

func sendData() { 

    let postDataURL = "http://exampleip.com/Send.php" 
    let url: NSURL = NSURL(string: postDataURL)! 
    let request: NSMutableURLRequest = NSMutableURLRequest(url:url as URL) 

    let bodyData = String(1) 

    request.httpMethod = "POST" 
    request.httpBody = bodyData.data(using: String.Encoding.utf8) 
    NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: OperationQueue.main) 
    { 
     (response, data, error) in 
     print(response!) 

     if let httpResponse = response as? HTTPURLResponse { 
      let statusCode = httpResponse.statusCode 

      if statusCode==200 { 
       print("Connection Successful") 

      } else { 
       print("Connection Failed (!200)") 
      } 
     } 
    } 
} 

-----增加了更好的附加代碼理解-----

新:MySQL代碼

CREATE TABLE IF NOT EXISTS `tests` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`testName` varchar(255) DEFAULT NULL, 
`testPop` int(11) DEFAULT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ; 

INSERT INTO `tests` (`id`, `testName`, `testPop`) VALUES 
(1, 'Test 1', '0'), 
(2, 'Test 2', '0'), 
(3, 'Test 3', '0'), 
(4, 'Test 4', '0'), 
(5, 'Test 5', '0'), 
(6, 'Test 6', '0'), 
(7, 'Test 7', '0'), 
(8, 'Test 8', '0'), 
(9, 'Test 9', '0'), 
(10, 'Test 10', '0'), 
(11, 'Test 11', '0'), 
(12, 'Test 12', '0'); 

舉例:在我從數據庫中如何接收,使用JSON。不知道這是否有幫助。斯威夫特3

func retrieveData() { 

let getDataURL = "http://exampleip.org/tests.php" 
let url: NSURL = NSURL(string: getDataURL)! 

do { 

    let data: Data = try Data(contentsOf: url as URL) 
    jsonArray = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! NSMutableArray 

    // Looping through jsonArray 
    for i in 0..<jsonArray.count { 

     // Create Test Object 
     let tID: String = (jsonArray[i] as AnyObject).object(forKey: "id") as! String 
     let tName: String = (jsonArray[i] as AnyObject).object(forKey: "testName") as! String 
     let tPop: String = (jsonArray[i] as AnyObject).object(forKey: "testPop") as! String 

     // Add Test Objects to Test Array 
     testArray.append(Test(testName: tName, andTestPop: tPop, andTestID: tID)) 

    } 
} 
catch { 
    print("Error: (Retrieving Data)") 
} 

myTableView.reloadData() 
} 
+0

什麼是'$ _POST [「a」]'應該等於? – bugfroggy

+3

如果你正在編寫新代碼,** _ please_不要使用'mysql_ *'函數**。它們已經老化並且破損,在PHP 5.5中已經被棄用了(它已經很舊了,它甚至不再接收安全更新),並且在PHP 7中完全刪除了。此外,您的代碼可以廣泛應用於[SQL注入](https:// en .wikipedia.org/wiki/SQL_injection)攻擊。使用['PDO'](https://secure.php.net/manual/en/book.pdo.php)或['mysqli_ *'](https://secure.php.net/manual/en/book .mysqli.php)替換爲_prepared statements_和_parameter binding_。有關詳細信息,請參閱http://stackoverflow.com/q/12859942/354577。 – Chris

+0

@bugfroggy多數民衆贊成在當我使用INSERT INTO VALUES不更新 – BroSimple

回答

2
$id = $_POST["id"]; 
$query = sprintf("UPDATE tests SET testPop=testPop+1 WHERE id = %d", $id); 
  • 首先,如果你是遞增值,讓數據庫爲您代勞。這將防止競爭狀態:如果/當兩個查詢同時發生時,只有一個會被正確保存。

  • 其次,不要將用戶生成的輸入直接添加到查詢中而不會轉義。在%d中使用sprintf會將id變量強制爲一個整數。

+0

這段代碼是怎麼回事? $ query = sprintf(「UPDATE tests SET testPop = $ testPop + 1 WHERE id = $ id」); - 除了我將它更改爲$ testPop或者我按照自己的方式執行操作之外,它是一樣的嗎? – BroSimple

+0

@BroSimple由於我不知道你的應用程序,所以我無法確切地告訴你該怎麼做。但是,您的示例仍然使用未轉義的用戶輸入。如果你不關心競爭條件,我們假設testPop是一個整數,你可以執行'$ query = sprintf(「UPDATE testsset testPop =%d + 1 WHERE id =%d」,$ testPop,$ id );' – ClickLabs

+0

用我有的代碼,數據庫沒有被更新。 - 我在問題中添加了其他代碼,也許你會更好地理解。還更新了php代碼和sendData代碼。 – BroSimple