我正在尝试将一个串行和随机的PIN写入mysql数据库,但是有些PIN值被写入多次。
如果已经存在,我如何跳过将$ pin写入pin列?
该片段如下:
<?php
for($serial = 1000; $serial <= 1600; $serial++) {
$serial_prefix = "HCIS";
//generate random figures.
$rand_pin1 = rand(10599, 99999);
$rand_pin2 = rand(22222, 89898);
$pin = $rand_pin1 . $rand_pin2;
$f_serial = $serial_prefix . $serial;
$check = "SELECT pin FROM pin_serial WHERE pin = '$pin'";
$check_query = mysqli_query($connection, $check);
if(mysqli_num_rows($check_query) > 0){
// how do I skip writing $pin into pin column if it already exist here
}
elseif(mysqli_num_rows($check_query) == 0){
//inserting a generated figure and $serial into serial and pin column.
$pin_serial_query = "INSERT INTO pin_serial (serial, pin) VALUES('$f_serial', '$pin')";
mysqli_query($connection, $pin_serial_query);
}
}
答案 0 :(得分:3)
为pin
列创建唯一索引:
ALTER TABLE `pin_serial` ADD UNIQUE INDEX (`pin`)
然后将您的查询更改为
INSERT INTO pin_serial (serial, pin) VALUES('$f_serial', '$pin')
ON DUPLICATE KEY UPDATE serial_pin = VALUES(serial_pin)
(注意ON DUPLICATE KEY UPDATE serial_pin = VALUES(serial_pin)
部分,这只是示例,您可以将pin = pin跳过)如果具有该引脚值的行已经存在,或者插入新行,它将更新查询。
您也可以使用INSERT IGNORE
语句,这将忽略重复项。
请注意,在您的示例中,该脚本容易受到 Sql injection 攻击。为避免这种情况,您应首先将参数传递给mysqli_real_escape_string函数以使数据在sql-safe内部(通过转义模糊字符)
答案 1 :(得分:1)
do..while循环可以解决您的问题:
textareas[i].onkeypress
虽然这可以解决您的直接问题,但随着行数的增加,您最终会发送越来越多的SQL请求,直到找到未使用的PIN。如果允许mySQL为每个新行生成唯一的PIN,您可能会对结果感到满意。
答案 2 :(得分:0)
如果你想将串行写入引脚生成引脚所在的行(有效地覆盖已经存在的旧串行,你将使用UPDATE语句:
... "UPDATE pin_serial SET serial='$serial'";
如果你只是想跳过这个pin / serial组合,我想你已经得到了答案。你的代码应该可行