首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果未创建行,则发送PHP错误

如果未创建行,则发送PHP错误
EN

Stack Overflow用户
提问于 2018-08-14 21:51:48
回答 2查看 120关注 0票数 0

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

谢谢

代码语言:javascript
复制
$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执行过程中失败,这在本例中没有完成。(它总是以成功的方式返回。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-15 13:41:48

解决方案1:

这个解决方案是基于你所期望的,并在RAISEERROR()的SQL语句中产生错误的方法,所以sqlsrv_query()将返回FALSE

代码语言:javascript
复制
<?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()检查结果

代码语言:javascript
复制
<?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()函数,这两个函数的使用有一定的限制。

票数 1
EN

Stack Overflow用户

发布于 2018-08-15 14:43:40

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

代码语言:javascript
复制
if (empty($stmt)){
    var_dump(sqlsrv_errors());
    die();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51843127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档