如果没有创建行,则发送 PHP 错误

Posted

技术标签:

【中文标题】如果没有创建行,则发送 PHP 错误【英文标题】:Send PHP Error if No Rows Created 【发布时间】:2018-08-14 13:51:48 【问题描述】:

我正在尝试防止创建重复的行。我当前的语句有效,这意味着它可以防止创建重复项,但它始终将执行返回为成功,这意味着如果没有创建任何行,我不会收到“错误”消息。

谢谢

$tsql = "
    IF NOT EXISTS ( SELECT 1 FROM SOMETABLE WHERE SOMEROW = 'VALUE' )
        BEGIN
            INSERT INTO SOMETABLE (
                SOMEROW
            )

            VALUES (
                'SOMETHING'
            )
            END
    ";


$stmt = sqlsrv_query( $conn, $tsql);


if(gettype($stmt)=='boolean')
    if($stmt)
        echo "Success"; 
     else 
        echo "This Row already Exists";
        die( print_r( sqlsrv_errors(), true));  
     

如果没有创建任何内容,我想失败 sql 执行,在这种情况下没有这样做。 (它总是作为成功返回。

谢谢

【问题讨论】:

你不能依赖SELECT的结果来判断唯一性,你需要对数据库本身使用唯一性约束,然后检查插入尝试的结果。 @RonnieOosting 他们正在使用 SQL Server。 在 SQL 中使用 IF ELSE 怎么样,ELSE 查询会导致固有的失败 - 从而给我想要的错误。这有多现实? @pufAmuf 更新了答案。我希望这会有所帮助。 【参考方案1】:

解决方案 1:

此解决方案基于您所期望的方法,并在使用 RAISEERROR() 的 SQL 状态中引发错误,因此 sqlsrv_query() 将返回 FALSE

<?php
# Connection
$server = 'server\instance,port';
$database = 'database';
$uid = 'username';
$pwd = 'password';
$cinfo = array(
    "Database" => $database,
    "UID" => $uid,
    "PWD" => $pwd
);
$conn = sqlsrv_connect($server, $cinfo);
if ( $conn === false ) 
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;


# INSERT statement
$tsql = 
    "
    IF NOT EXISTS (SELECT 1 FROM SOMETABLE WHERE SOMEROW = 'VALUE5' ) BEGIN
        INSERT INTO SOMETABLE (SOMEROW) VALUES ('VALUE5')
        END
    ELSE BEGIN
        RAISERROR (N'This row already exists.', 10, 1);
    END;
    ";
$stmt = sqlsrv_query($conn, $tsql);  
if ($stmt === false) 
    die(print_r(sqlsrv_errors(), true));
 else 
    sqlsrv_free_stmt($stmt);
    echo "Success"; 
   

# End
sqlsrv_close($conn);
?>

解决方案 2:

可以从你的语句返回输出,然后用sqlsrv_fetch_array()检查结果:

<?php
# Connection
$server = 'server\instance,port';
$database = 'database';
$uid = 'username';
$pwd = 'password';
$cinfo = array(
    "Database" => $database,
    "UID" => $uid,
    "PWD" => $pwd
);
$conn = sqlsrv_connect($server, $cinfo);
if ( $conn === false ) 
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;


# INSERT statement
$tsql = 
    "
    SET NOCOUNT ON;
    IF NOT EXISTS (SELECT 1 FROM SOMETABLE WHERE SOMEROW = 'VALUE' ) BEGIN
        INSERT INTO SOMETABLE (SOMEROW) VALUES ('VALUE')
        SELECT @@ROWCOUNT AS RC
        END
    ELSE BEGIN
        SELECT 0 AS RC
    END;
    ";
$stmt = sqlsrv_query($conn, $tsql);  
if ($stmt === false) 
    die( print_r( sqlsrv_errors(), true));


# Row count information
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) 
    $rc = $row['RC'];

if ($rc == 0) 
    echo "This Row already Exists";
 else 
    echo "Success"; 


# End
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

注意事项:

SQLSRV 驱动支持sqlsrv_rows_affected() 和sqlsrv_num_rows() 函数,使用时有一些限制。

【讨论】:

【参考方案2】:

变量的布尔检查是为了成功执行查询,您应该检查它是否为布尔类型并且是否为空。这是由empty 函数完成的。

if (empty($stmt))
    var_dump(sqlsrv_errors());
    die();

【讨论】:

以上是关于如果没有创建行,则发送 PHP 错误的主要内容,如果未能解决你的问题,请参考以下文章

创建一个shell,检查命令行参数个数,如果参数不是三个,则显示一条错误信息

如何修复 PHP 中的“标头已发送”错误

如何修复 PHP 中的“标头已发送”错误

如何修复 PHP 中的“标头已发送”错误

如何修复 PHP 中的“标头已发送”错误

无法让 PHP 报告错误