正确的 PHP 代码? - 插入 MySQL

Posted

技术标签:

【中文标题】正确的 PHP 代码? - 插入 MySQL【英文标题】:Correct PHP Code? - To Insert to MySQL 【发布时间】:2016-12-05 22:43:47 【问题描述】:

我有一个使用 Swift 3 的 ios 应用程序,使用 php 文件接收对象,但现在正在努力将对象更新到数据库中。

我是 PHP 新手,所以我的问题是,下面的 php 代码是否正确?它应该从我的应用程序中插入一个变量,该变量是按钮的 +1 点,以通过 php 并在 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 从数据库接收信息。不知道这是否有帮助。斯威夫特 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()

【问题讨论】:

$_POST["a"] 应该等于什么? 如果您正在编写新代码,不要使用mysql_* 函数。它们陈旧且损坏,在 PHP 5.5 中被弃用(它太旧了,甚至不再接收安全更新),并在 PHP 7 中完全删除。此外,您的代码对SQL injection 攻击开放。将PDOmysqli_*prepared statementsparameter binding 一起使用。详情请见***.com/q/12859942/354577。 @bugfroggy 那是我使用 INSERT INTO VALUES not UPDATE 的时候 @Chris 谢谢!这是代码中唯一的错误吗?将 mysql_* 函数更改为 mysqli? 您的代码不正确,因为您在 UPDATE 查询中使用它:$testPop = $_POST["a"]; $query = "UPDATE tests SET testPop='$testPop' WHERE $testPop"; 【参考方案1】:
$id = $_POST["id"];
$query = sprintf("UPDATE tests SET testPop=testPop+1 WHERE id = %d", $id);

首先,如果您要增加一个值,请让数据库为您完成。这将防止竞争条件:如果/当 2 个查询同时发生时,只有一个会被正确保存。

其次,不要将用户生成的输入直接添加到查询中而不进行转义。将 sprintf 与 %d 一起使用会强制 id 变量为整数。

【讨论】:

这段代码怎么样? $query = sprintf("更新测试 SET testPop=$testPop+1 WHERE id = $id"); - 除了我把它改成 $testPop 或者我按照你的方式做之外,它是一样的? @BroSimple 由于我不了解您的应用程序,因此我无法确切告诉您该怎么做。但是,您的示例仍然使用未转义的用户输入。如果你不关心竞态条件并且我们假设 testPop 是一个整数,你可以这样做$query = sprintf("UPDATE tests SET testPop=%d+1 WHERE id = %d", $testPop, $id); 使用我的代码,数据库没有被更新。 - 我在问题中添加了额外的代码,也许你会得到更好的理解。还更新了php代码和sendData代码。 由于您正在为测试 +1,我的原始答案似乎是最好的。 $query = sprintf("UPDATE tests SET testPop=testPop+1 WHERE id = %d", $id); 这样,如果 testPop 是 4,那么现在是 5。 好的,感谢尝试此代码,但它是用于将数据发送到数据库的快速代码,是否正确?我怎么知道 php 代码有效?

以上是关于正确的 PHP 代码? - 插入 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

如何使用php将日期插入mysql查询? [复制]

PHP- MySQL 数据库插入操作不起作用 [重复]

正确格式化的 MySQL 日期插入语句返回全 0

使用插入查询 CI PHP Mysql Ajax

如何在 MySQL 数据库中插入 pdf 文件,然后在 php 中读取?

Codeigniter MySQL 不正确的日期时间插入