我有一个场景,我将如何确保所有插入查询都正常工作。我使用 PHP 作为后端编码,使用 mysql 作为我的数据库。下面我简要描述我的问题。
我有两张桌子。一张表用于 login_details,另一张表用于 Personal_details。我的表结构在这里。
表 login_details 此处 user_id 是唯一主键,sl_num 是自动增量:
th{
padding: 3px;
border: 1px solid black;
}
td{
padding: 3px;
border: 1px solid black;
}
<table>
<thead>
<th>sl_num</th>
<th>user_id</th>
<th>email</th>
<th>password</th>
</thead>
<tbody>
<tr>
<td>1</td>
<td>123</td>
<td>[email protected]</td>
<td>5567</td>
</tr>
<tr>
<td>2</td>
<td>246</td>
<td>[email protected]</td>
<td>9908</td>
</tr>
</tbody>
</table>
我的第二个表是personal_details。这里 user_id 也是主键,这个键也维护两个表之间的关系,sl_num 是自动增量的:
th{
padding: 3px;
border: 1px solid black;
}
td{
padding: 3px;
border: 1px solid black;
}
<table>
<thead>
<th>sl_num</th>
<th>user_id</th>
<th>name</th>
<th>address</th>
<th>age</th>
</thead>
<tbody>
<tr>
<td>1</td>
<td>123</td>
<td>Daniel</td>
<td>San Francisco</td>
<td>23</td>
</tr>
<tr>
<td>2</td>
<td>246</td>
<td>Lucy</td>
<td>London</td>
<td>27</td>
</tr>
</tbody>
</table>
而且,我使用此代码在这些表中插入值。
<?php
$user_id = uniqid();
$email = $_POST['email'];
$password = $_POST['password'];
$name = $_POST['name'];
$address = $_POST['address'];
$age = $_POST['age'];
$con = mysqli_connect('localhost', 'username', 'password',
'user_db');
$query = "INSERT INTO `login_details` (`user_id`, `email`,
`password`) VALUES ('$user_id', '$email', '$password')";
mysqli_query($con,$query);
$query2 = "INSERT INTO `personal_details` (`user_id`, `name`,
`address`, `age`) VALUES ('$user_id', '$name', '$address',
'$age')";
mysqli_query($con,$query);
echo 'User created successfully';?>
但是曾经发生过一次有线问题。第三个用户名“John Doe”试图创建他的帐户。Personal_details 表的详细信息插入成功,但由于某些原因没有插入 login_details 的详细信息。因此,用户“John Doe”在桌子上有个人信息,但由于他没有任何登录信息,因此无法登录。
那么,这种多插入情况的最佳解决方案是什么。我怎样才能防止这种情况。这意味着,如果将一行插入到 login_details 中,那么系统必须确保相关行也插入到personal_details 表中。如果两个插入成功,那么事务发生了,或者如果插入了一行而另一行没有插入,那么系统将自动丢弃插入的行并显示失败消息。
查询失败的原因可能是因为您没有转义 SQL 上下文中的任何变量。这意味着如果其中一个'
字符串中存在某个位置,则 SQL 语句将变为无效。这称为 SQL 注入攻击,可以迅速使您的应用程序容易受到攻击。
减轻这些攻击的常用方法是改用准备好的语句。
如果第一个查询失败,那至少可以让您取消第二个查询。但是如果第二个失败了怎么办(由于某种原因,当您使用了正确的 ..如果您正确地转义了变量,但磁盘可以满载等情况下,这实际上不会发生)。
您可以将这两个语句包装在一个 SQL 事务中,然后在任何查询失败时提交或回滚该事务。这假设您在 MySQL 中的表/数据库类型支持事务并且禁用了自动提交。
您可以通过调用 mysqli 启动事务mysqli_begin_transaction($con)
。
然后,您可以通过调用mysqli_commit
或来提交或回滚事务mysqli_rollback
。
要检测上一条语句是否失败,您可以调用mysqli_error
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句