MySQL具体条目数
MySQL specific number of entries
你好,我有一个 Mysql table,我在 php 脚本中填写了它。在此脚本中,我检查特定类型的条目数是否已达到最大值以通知客户。如果条目数较少,我让他在我的 table 中插入一个新条目。 table 看起来像这样
--------------------
Date | Type
--------------------
Tuesday 13:00 | Car
检查的php脚本看起来像这样
<?php
$sql = $conn->prepare("SELECT count(*) FROM Table WHERE Date='Tuesday 13:00' AND Type='Car'");
$sql ->execute();
$sql_rows = $sql->fetchColumn();
if ($sql_rows > 20){
echo "All entries for this type has been filled please choose another to continue";
}else{
$insert = $conn->prepare("INSERT INTO Table VALUES('Tuesday 13:00', 'Car')");
$insert -> execute();
}
?>
我现在的问题是,如果 100 个人同时访问这个 php 脚本,php 脚本是否允许恰好 19 个人插入他们自己 'Tuesday 13:00','Car' 进入数据库或更多,我如何在不给客户带来不便的情况下防止这种情况发生?
使用事务来确保两个查询都使用 table 的相同快照。事务将锁定 table 以便其他人等待。将 $conn->startTransaction()
放在第一个 SELECT
查询之前,在查询中添加一个 FOR UPDATE
子句,并在 INSERT
.
之后添加 $conn->commit()
您必须使用 InnoDB,而不是 MyISAM,事务才能有效。
<?php
$sql = $conn->prepare("SELECT count(*) FROM Table
WHERE Date='Tuesday 13:00' AND Type='Car'
FOR UPDATE");
$conn->startTransaction();
$sql ->execute();
$sql_rows = $sql->fetchColumn();
if ($sql_rows > 20){
echo "All entries for this type has been filled please choose another to continue";
}else{
$insert = $conn->prepare("INSERT INTO Table VALUES('Tuesday 13:00', 'Car')");
$insert -> execute();
}
$conn->commit();
你好,我有一个 Mysql table,我在 php 脚本中填写了它。在此脚本中,我检查特定类型的条目数是否已达到最大值以通知客户。如果条目数较少,我让他在我的 table 中插入一个新条目。 table 看起来像这样
--------------------
Date | Type
--------------------
Tuesday 13:00 | Car
检查的php脚本看起来像这样
<?php
$sql = $conn->prepare("SELECT count(*) FROM Table WHERE Date='Tuesday 13:00' AND Type='Car'");
$sql ->execute();
$sql_rows = $sql->fetchColumn();
if ($sql_rows > 20){
echo "All entries for this type has been filled please choose another to continue";
}else{
$insert = $conn->prepare("INSERT INTO Table VALUES('Tuesday 13:00', 'Car')");
$insert -> execute();
}
?>
我现在的问题是,如果 100 个人同时访问这个 php 脚本,php 脚本是否允许恰好 19 个人插入他们自己 'Tuesday 13:00','Car' 进入数据库或更多,我如何在不给客户带来不便的情况下防止这种情况发生?
使用事务来确保两个查询都使用 table 的相同快照。事务将锁定 table 以便其他人等待。将 $conn->startTransaction()
放在第一个 SELECT
查询之前,在查询中添加一个 FOR UPDATE
子句,并在 INSERT
.
$conn->commit()
您必须使用 InnoDB,而不是 MyISAM,事务才能有效。
<?php
$sql = $conn->prepare("SELECT count(*) FROM Table
WHERE Date='Tuesday 13:00' AND Type='Car'
FOR UPDATE");
$conn->startTransaction();
$sql ->execute();
$sql_rows = $sql->fetchColumn();
if ($sql_rows > 20){
echo "All entries for this type has been filled please choose another to continue";
}else{
$insert = $conn->prepare("INSERT INTO Table VALUES('Tuesday 13:00', 'Car')");
$insert -> execute();
}
$conn->commit();