2016-12-05 3 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; 
    } 
} 

?> 

Swift 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. Не знаю, помогает ли это. Swift 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

Если вы пишете новый код, ** _ пожалуйста, не используйте 'mysql_ *' функции **. Они старые и сломанные, устарели в PHP 5.5 (который настолько старый, что он даже не получает обновлений безопасности), и полностью удалены в PHP 7. Кроме того, ваш код широко открыт для [SQL injection] (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 thats, когда я использовал INSERT INTO VALUES, а не ОБНОВЛЕНИЕ – BroSimple

ответ

2
$id = $_POST["id"]; 
$query = sprintf("UPDATE tests SET testPop=testPop+1 WHERE id = %d", $id); 
  • Во-первых, если вы приращением значение, пусть база данных сделать это для вас. Это предотвратит состояние гонки: если/когда одновременно выполняются 2 запроса, только один будет сохранен правильно.

  • Во-вторых, не добавляйте созданный пользователем ввод непосредственно в запрос без экранирования. Использование sprintf с% d заставляет переменную id целое.

+0

Как этот код? $ query = sprintf («Тесты UPDATE SET testPop = $ testPop + 1 WHERE id = $ id"); - Это то же самое, за исключением того, что я изменил его на $ testPop или я делаю это по-своему? – BroSimple

+0

@BroSimple Поскольку я не знаю вашего приложения, я не могу точно сказать, что делать. Но ваш пример по-прежнему использует неэкранированный пользовательский ввод. Если вы не заботитесь о состоянии гонки, и мы предполагаем, что testPop является целым числом, вы можете сделать '$ query = sprintf (" UPDATE test SET testPop =% d + 1 WHERE id =% d ", $ testPop, $ id); ' – ClickLabs

+0

С кодом, который у меня есть, база данных не обновляется. - Я добавил дополнительный код к вопросу, может быть, вы поймете лучшее понимание. Также обновлен код php и код sendData. – BroSimple