在MySQL中使用UPDATE语句的问题

时间:2018-07-24 23:31:46

标签: php mysql mysqli sql-update

我正在尝试使用PHP和MySQL更新专栏。

基本上,我有一个成人数据库和一个儿童数据库。添加我的孩子后,我想将孩子的ID添加到他们各自的成年人中。

添加我的孩子后,我将获取该INSERT的ID(我已经有成人的ID)。

如果成人没有孩子,我只需添加孩子的ID(第一次运行总是如此)。我遇到的问题是当我为同一个成年人添加第二个孩子时。成人的“孩子”列不会更新。我用#分割孩子的ID。

第一次即可完美运行,但是每隔一次便无法更新表。

我的代码是:

$sqlstatment = "INSERT INTO attendees (first, last, dob, access) VALUES ('$first','$last','$dob','$parent')";
$result = $link->query( $sqlstatment );

if ( $result ) {
            $kid_id = $link->insert_id;
            if ( $profile[ 'kids' ] === "" ) {
                $kids = $kid_id;
            } else {
                $kids = $profile[ 'kids' ]. "#" . $kid_id;
            }

            $updatesql = "UPDATE access SET kids = $kids WHERE id = $parent";
            $updaccess = $link->query( $updatesql );
            if ( $updaccess ) { 
                outputToConsole("Adult update success");
            } else {
                outputToConsole("Adult update failed");
            }
}

表格格式

enter image description here

2 个答案:

答案 0 :(得分:2)

问题在于您没有在SQL查询中引用您的值。考虑两个结果查询:

UPDATE access SET kids = 1 WHERE id = 4

UPDATE access SET kids = 1#6 WHERE id = 4

在第一个查询中,将1视为数字,所以很好。在第二个中,1#6旨在作为字符串,但是在其周围没有引号(")时,不会将其视为一个字符串。您会收到某种语法错误(顺便说一句,您可以使用mysqli_error()来获取一条错误消息,该错误消息将为您提供更多信息)。

您需要在值周围加上引号,例如:

UPDATE access SET kids = '1' WHERE id = '4'

UPDATE access SET kids = '1#6' WHERE id = '4'

这是非常重要,否则您的应用程序容易受到SQL注入攻击的侵害,在这种情况下,这将使某人可以随意更改整个数据库查询。 Google的“ SQL注入”功能,还可以查看PHP函数mysqli_real_escape_string中的转到功能,以确保您免受这种攻击。

另一个注意事项:您应该记住kids字段只能容纳255个字符。随着您的与会者行ID变大,您可能会发现更新查询中的kids值被截断,并且无意中为给定的访问行分配了错误的attendees条目,而其他条目则完全丢失。为了解决这个问题,请研究使用关系/多对多表,例如access_to_attendees

答案 1 :(得分:1)

我处理此类问题的个人方法是在整体上利用现有类,而不是混合使用不同的方法。这样可以确保问题(例如提到的SQL注入)和错误,类方法的结果得到正确处理,从而产生更多的容错代码和更流畅的调试过程等。

$query = "INSERT INTO attendees (first, last, dob, access) VALUES (:first,:last,:dob,:parent)";
try {
    $statement = $link->prepare($query);
    $statement->bindValue(":first",$first,PDO::PARAM_STR);
    $statement->bindValue(":last",$last,PDO::PARAM_STR);
    $statement->bindValue(":dob",$dob,PDO::PARAM_STR);
    $statement->bindValue(":parent",$parent,PDO::PARAM_STR);
    if ($statement->execute()) {
        $kid_id = $statement->insert_id();
        $kids = ($profile[ 'kids' ] === "")?  $kid_id : $profile['kids']."#".$kid_id; 
        $updatequery = "UPDATE access SET kids = :kids WHERE id = :parent";
        try { 
            $updatestatement = $link->prepare($updatequery);
            $updatestatement->bindValue(":kids",$kids,PDO::PARAM_STR);
            $updatestatement->bindValue(":parent",$parent,PDO::PARAM_STR);
            if ($updatestatement->execute())
                outputToConsole("Adult update success");
        } catch (PDOException $e) {
            outputToConsole("Adult update failed");
        }
    };
} catch (PDOException $e) {
    outputToConsole($e->getMessage());
}