我在 MySQL 中创建了一个函数:
CREATE DEFINER=`DBadmin`@`localhost` FUNCTION `insert_color`(
p_color_Name VARCHAR(45)
) RETURNS int(11)
BEGIN
DECLARE
color_count INT;
SELECT COUNT(p_color_Name) INTO color_count FROM Color
WHERE p_color_Name = Color.Color_Name;
IF color_count >= 1 THEN
RETURN -1;
ELSEIF color_count = 0 THEN
INSERT INTO Color(Color_Name)
VALUES (p_color_Name);
RETURN 1;
END IF;
END
我想在 PHP 中调用它来使用输入的信息进行插入,但我遇到了麻烦。
<?php
$conn = new mysqli('localhost','DBadmin','dbadmin','BirdDatabase');
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
echo "-1";
return false;
}
$var1 = $_GET['selectedOption'];
$var2 = $_GET['newNameText'];
$var3 = $_GET['selectedType'];
else if ($var1 == "Color"){
$sqlVariableUser = 'SELECT insert_color(?);';
if(!$stmt = $conn->prepare($sqlVariableUser)){
exit($conn->error);
return false;
} else {
$stmt->bind_param($var2);
$stmt->execute();
$result= $stmt->get_result();
exit ($result);
}
}
?>
我是 MySQL 新手,我知道如何使用 Oracle 数据库执行此操作,但我在 MySQL 连接方面遇到问题。任何建议都会有帮助:)
最佳答案
完成一项相当简单的任务似乎有很多繁琐的内容。当我们只用 SQL 就能完成我们需要的事情时,我们倾向于避免创建 MySQL 存储程序。
当函数从两个(或更多) session 同时执行时,函数中存在潜在的竞争条件。两次执行中的 SELECT 可能找不到指定的 color_name
,然后两个 session 都会尝试插入相同的 color_name
。
如果color_name
在颜色表中应该是唯一的,则声明一个UNIQUE约束,并让数据库为您检查它,并在尝试插入重复的color_name时返回错误
到表中。或者,如果您不想抛出错误,请使用 INSERT IGNORE
。或者,INSERT ... ON DUPLICATE KEY
语句。
如果由于某种原因无法将 color_name
设为 UNIQUE,您仍然可以完成该函数正在执行的操作,只需使用一个 INSERT ... SELECT
语句即可执行检查行是否已存在。
INSERT INTO color (color_name)
SELECT v.color_name
FROM ( SELECT c.color_name
FROM ( SELECT ? AS color_name ) c
LEFT
JOIN color d
ON d.color_name = c.color_name
WHERE d.color_name IS NULL
AND c.color_name IS NOT NULL
) v
内联 View c
返回包含所提供值的行,如果匹配行尚不存在,则我们要插入到表中的 color_name 值。
内联 View v
使用反连接模式,仅当表中不存在匹配行时才从 c
返回行。外部 INSERT ... SELECT
将尝试从 v
插入一行。
(您询问建议;这些是我的建议。)
关于php - 从 PHP 调用 MySql 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30418798/