注意:“我是一个新手。我需要一个mysql查询,不允许用户在数据库中已经存在的范围内输入数字。我在这里处理卡片和卡片的数量是user1制造的产品将在他/她开始之前通过创建页面插入。而user2可以在另一台机器上开始但没有事先的信息abt user1从哪里开始。例如,如果user2试图从1,2,3开始选择任何东西, 4,5,6,最多2530会出现触发器或错误,这会阻止它们复制user1已经完成的范围。
根据建议,我在表格中有一个“number_from”和一个“number_to”列。找到我想在下表中找到的内容
另请注意,复制卡应该取决于job_number,因为作业的唯一标识符是job_number,对于任何作业都不能相同。
我之前已经问过这个问题但是没有解决方案的清晰度,或者因为我没有编写触发器或存储过程的经验。就像我之前说的“我是一个新手”,我的未来取决于这个
id |user_id| number_from | number_to | client | cardtype | job_number | job_quant |status
1 | smith | 1 | 2530 | queens |inspiration| j290122 | 5000 |nt done
2 | john | 2531 | 4000 | queens |inspiration| j290122 | 5000 |nt done
4 | kenny | 1 | 1500 |seabirds| love | j300011 | 1500 | done
3 | wayne | 4001 | 5000 | queens |inspiration| j290122 | 5000 | done
user_id是外键
id | user | password
1 |smith | ********
2 |john | ********
3 |wayne | ********
4 |kenny | ********
5 |laura | ********
到目前为止,我所有的插件查询都将数据添加到数据库中。
<?php
if (isset($_POST['submit'])) {
// process the form
$user_id = (int) $_POST["user_id"];
$number_from = $_POST["number_from"];
$number_to = $_POST["number_to"];
$client = mysql_prep($_POST["client"]);
$cardtype = $_POST["cardtype"];
$job_number = $_POST["job_number"];
$job_quantity = $_POST["job_quantity"];
$status = $_POST["status"];
$query = "INSERT INTO jobs (";
$query .= " user_id, number_from, number_to, client, cardtype, job_number, job_quantity, status";
$query .= ") VALUES (";
$query .= " '{$user_id}', '{$number_from}', '{$number_to}', '{$client}', '{$card_type}', '{$job_number}', '{$job_quantity}', '{$status}'";
$query .= ")";
$result = mysqli_query($connection, $query);
if ($result) {
// success
$_SESSION["message"] = "job created.";
redirect_to("manage_job.php");
} else {
// failure
$_SESSION["message"] = "job creation failed.";
redirect_to("new_job.php");
}
}
?>
答案 0 :(得分:0)
更新:在评论中澄清了@benga和@gview后,我重写了答案。
为避免重叠,您可以通过触发器或编写应用程序逻辑(在您的情况下使用PHP)来实现。在这两种情况下,您都需要参数new_number_from
和new_number_to
。前者是新条目的 number_from 值。后者是新条目的 number_to 值。您还需要new_job_number
。
下面的查询返回与参数$new_number_from
和$new_number_to
指定的范围重叠的所有行,用于ID为$job_number
的作业
SELECT * FROM jobs WHERE
job_number=$jobNumber AND
number_from <= $new_number_to AND
number_to >= $new_number_from
如果使用PHP实现此功能,则可以执行此查询并检查是否返回任何行。如果返回空结果集,则不存在冲突。否则就会发生冲突。
注意:您可能更愿意获取计数(SELECT COUNT(*)
)而不是返回行(SELECT *
)
答案 1 :(得分:0)
在我看来,MySQL触发器和存储过程是错综复杂的。但是,您可以创建一个过程并在BEFORE触发器中调用它,传递NEW.job_number,new.number_from和new.number_to,然后查询。然后,您的代码必须被修改为try..catch以解决您的mysql错误。
您也可以通过一系列执行此操作的查询来以程序方式(在PHP中)执行此操作:
LOCK TABLES jobs WRITE;
SELECT count(*) as countof FROM jobs
WHERE job_number = $job_number
AND (($number_from BETWEEN number_from AND number_to) OR ($number_to BETWEEN number_from AND number_to));
// Fetch the result, and if it's == 0, then you insert.
UNLOCK TABLES;
如果您决定使用带有CALL Procedure(params ...)技术的触发器,查询的内部将是相同的,只有您传递NEW。它的变量。
答案 2 :(得分:0)
FWIW,我个人认为这更具可读性......
$query = "
INSERT INTO jobs
(user_id
,number_from
,number_to
,client
,cardtype
,job_number
,job_quantity
,status) VALUES
('$user_id'
,'$number_from'
,'$number_to'
,'$client'
,'$card_type'
,'$job_number'
,'$job_quantity'
,'$status'
);
";
我只包含引号,因为我没有哪个值是字符串。