从PHP调用MySql函数

时间:2015-05-24 00:06:12

标签: 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连接问题。任何建议都会有所帮助:)

1 个答案:

答案 0 :(得分:0)

看起来很难完成一项相当简单的任务。当我们只用SQL完成我们需要的东西时,我们倾向于避免创建MySQL存储程序。

当函数从两个(或更多)会话同时执行时,函数中存在潜在的竞争条件。两次执行中的SELECT可能找不到指定的color_name,然后两个会话都将尝试插入相同的color_name

如果color_name在颜色表中应该是UNIQUE,那么声明一个UNIQUE约束,让数据库为您检查它,并在尝试将重复的color_name插入到该数据库时返回错误表。或者,如果您不想打扰错误,请使用INSERT IGNORE。或者,INSERT ... ON DUPLICATE KEY声明。

如果有某种原因导致color_name不能成为UNIQUE,那么你仍然可以使用一个INSERT ... SELECT语句完成该函数正在做的事情,该语句执行检查行是否已存在。< / p>

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

内联视图c返回包含提供的值的行,如果匹配的行尚不存在,则返回我们要插入表的color_name的值。

内联视图v使用反连接模式,仅当表中不存在匹配的行时才从c返回行。外INSERT ... SELECT将尝试从v插入一行。

(你问过建议;这些是我的建议。)