php - 从 PHP 调用 MySql 函数

标签 php mysql ajax

我在 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/

相关文章:

php - 检查名称是否为 "human"?

c# - 将桌面 C# 应用程序连接到在线 MySQL 数据库

javascript - 我的观点之一没有出现在我的主人 - Laravel

mysql - 发送写入到 mysql master 并以 slick 方式读取到 slave

jquery - 如何将此 js 数组传递到我的 MVC 3 Controller ?

php - 如何使用 GCM 在 php 中向数百万 Android 设备发送通知

php - 参数数组MySQLi的动态绑定(bind)

mysql - 如何将 sql 查询/查询的结果用于另一个选择查询?

javascript - 拔掉网线时抛出DOM异常

python - web2py ajax问题onclick