我对php和mysql很陌生,所以当我试着解释我的目标时,请耐心等待。
我有一个在线表单,它将获取信息并将其放入MYSQL数据库。该功能完美无缺,但现在我想尽可能减少重复的条目。
我们的员工将在数据库中输入客户名称,帐单邮寄地址和送货地址。有些客户有多个帐单邮寄地址和送货地址。我想做的是使它如果这3个中的任何一个是新条目,则保存记录,但如果所有3都是重复,则它不会被插入到数据库中。我希望这样的事情可以解决问题:
$cn = $_POST[CustomerName];
$ba = $_POST[BillingAddress];
$sa = $_POST[ShippingAddress];
$custname = mysqli_query("SELECT DISTINCT customerName FROM customer WHERE customerName LIKE '$cn'");
$billaddress = mysqli_query("SELECT DISTINCT billingaddress FROM customer WHERE billingaddress LIKE '$ba'");
$shipaddress = mysqli_query("SELECT DISTINCT shippingaddress FROM customer WHERE shippingaddress LIKE '$sa'");
if ($custname != $_POST[CustomerName] OR $billaddress != $_POST[BillingAddress] OR $shipaddress != $_POST[ShippingAddress])
{
mysqli_query($con,"INSERT INTO customer(customerName, billingaddress, shippingaddress)
VALUES
('$_POST[CustomerName]','$_POST[BillingAddress]','$_POST[ShippingAddress]')");
}
不幸的是,当所有三个参数都是重复时,这仍会添加记录。关于为什么会发生这种情况的任何想法,或者关于如何使我想要的结果更容易的任何建议?
我已尝试将客户名称字段设为唯一,但在这种情况下,它会删除整个记录。如果我理解正确,主键/唯一方法将无法用于我的问题。这可能是我缺乏经验的谈话,所以如果有人能帮助我,我会非常感激。
编辑:我想我还提到我尝试过使用mysql_real_escape_string方法和数组返回方法无济于事。 表格定义如下:
**customer**
idcustomer (primary key, auto-increment)
customerName
billingaddress
shippingaddress
答案 0 :(得分:0)
我建议使用触发器通过BEFORE
操作来控制交易的逻辑。
DELIMITER $$
CREATE TRIGGER tbl_noduplicate
BEFORE INSERT ON tbl
FOR EACH ROW
BEGIN
IF (EXISTS(SELECT * FROM tbl WHERE col1 = NEW.col1)) THEN
INSERT INTO tbl (col1,col2,col3)
VALUES (NEW.col1, NEW.col2, NEW.col3);
END IF;
END$$
DELIMITER ;
好的 - 这就是我的想法:
1-这里是一个我认为你应该实施的新数据模型:
当一个客户有一个或多个送货地址或帐单地址时
以下是执行此操作的代码:
CREATE TABLE IF NOT EXISTS customer (
idcustomer int(11) NOT NULL DEFAULT 0,
customerName varchar(30) DEFAULT NULL,
customer_email varchar(30) DEFAULT NULL,
PRIMARY KEY (idcustomer)
);
CREATE TABLE IF NOT EXISTS ref_address_type (
address_type_code int(11) DEFAULT NULL,
address_type_desc varchar(30) DEFAULT NULL,
UNIQUE INDEX UK_ref_address_type_address_ty (address_type_code)
);
CREATE TABLE IF NOT EXISTS customer_address (
idaddress int(11) NOT NULL DEFAULT 0,
fk_idcustomer int(11) DEFAULT NULL,
street varchar(100) DEFAULT NULL,
street_number int(11) DEFAULT NULL,
house_app_number int(11) DEFAULT NULL,
city varchar(50) DEFAULT NULL,
country varchar(50) DEFAULT NULL,
zipcode int(11) DEFAULT NULL,
fk_address_type_code int(11) DEFAULT NULL,
PRIMARY KEY (idaddress),
CONSTRAINT FK_customer_address_customer_idcustomer FOREIGN KEY (fk_idcustomer)
REFERENCES customer (idcustomer) ,
CONSTRAINT FK_customer_address_ref_address_type_address_type_code FOREIGN KEY (fk_address_type_code)
REFERENCES ref_address_type (address_type_code)
);