避免重复范围内的值

时间:2014-05-22 17:17:24

标签: php mysql

注意:“我是一个新手。我需要一个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");
  }  
} 
?>

3 个答案:

答案 0 :(得分:0)

更新:在评论中澄清了@benga和@gview后,我重写了答案。

为避免重叠,您可以通过触发器或编写应用程序逻辑(在您的情况下使用PHP)来实现。在这两种情况下,您都需要参数new_number_fromnew_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'
);
";

我只包含引号,因为我没有哪个值是字符串。