我正在尝试使用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");
}
}
表格格式
答案 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());
}