【问题标题】:PHP/SQL - IF conditional not working as intendedPHP/SQL - 如果条件不按预期工作
【发布时间】:2018-05-24 15:44:24
【问题描述】:

我是编程新手,最近学到了很多东西。目前我正在使用 SQL 表在 PHP 中工作。我在类似于出租的系统中有一个功能,其中每个“出租”项目在表中生成一行包含用户和项目数据的行,但我需要将其限制为每个用户只使用一种项目,例如:

好的:

  • 用户1/汽车
  • 用户 1 / 卡车
  • 用户 1 / 自行车

不好:

  • 用户1/汽车
  • 用户1/汽车
  • 用户 1 / 卡车

我现在所拥有的插入行完全没问题,但是当它检查用户是否已经拥有某种物品时问题就来了。我插入的第一个项目有效,它会在表格上插入行,如果您尝试再次插入相同的项目,它不会让您这样做,但是一旦我尝试使用第二个项目来做它,它就会一直让我插入相同的项目一遍又一遍,没有限制。 我认为这与我使用条件的方式有关,但我无法解决它,我已经在这里待了 2 天没有任何进展。

这是我的代码:

function BuscaPREST($rut,$serial){
        include("conexion.mydb.php");

        //Gets user info
        $sql="SELECT * FROM ALUMNO WHERE ALU_RUT=".$rut;

        $result=odbc_exec($Conx_Web, $sql);
        if(odbc_fetch_row($result)){
            $ALU_RUT=odbc_result($result, "ALU_RUT");
            $ALU_DIG_VER=odbc_result($result, "ALU_DIG_VER");
            $ALU_NOM=odbc_result($result, "ALU_NOM");
            $ALU_APE=odbc_result($result, "ALU_APE_PAT")." ".odbc_result($result, "ALU_APE_MAT");
            $ALU_MAIL=odbc_result($result, "ALU_MAIL");

            include("conexion.db.php");

            //Gets items info
            $sql2="SELECT * FROM ARTICULOS WHERE ART_SER='".$serial."'";

            $result2=odbc_exec($Conx_DB, $sql2);    
            if(odbc_fetch_row($result2)){
                $ART_TIPO=odbc_result($result2, "ART_TIPO");
                $ART_MOD=odbc_result($result2, "ART_MOD");
                $ART_SER=odbc_result($result2, "ART_SER");

                //Gets user and item info from table where I'm inserting the rentals
                $sql3="SELECT * FROM PRESTAMOS WHERE ALU_RUT=".$ALU_RUT;

                $res=odbc_exec($Conx_DB, $sql3);
                $ALU_RUT2=odbc_result($res, "ALU_RUT");
                $ART_TIPO2=odbc_result($res, "ART_TIPO");

                //Checks if the user already has an item of the same kind
                if($ALU_RUT==$ALU_RUT2 && $ART_TIPO==$ART_TIPO2){   
                    $msg="El alumno ya tiene un artículo de este tipo.";
                    echo "<script type='text/javascript'>alert('$msg');</script>";
                }else{
                    $sql4=odbc_prepare($Conx_DB,"INSERT INTO PRESTAMOS (ALU_RUT,ALU_NOM,ALU_APE,ALU_MAIL,FEC_PRE,ART_SER,ART_MOD,ART_TIPO,ALU_DIG_VER) VALUES ('".$ALU_RUT."','".$ALU_NOM."','".$ALU_APE."','".$ALU_MAIL."','".date('d-m-Y')."','".$ART_SER."','".$ART_MOD."','".$ART_TIPO."','".$ALU_DIG_VER."');");   
                    odbc_execute($sql4);

                    $message="PRÉSTAMO INGRESADO CORRECTAMENTE";
                    echo "<script type='text/javascript'>alert('$message');</script>";
                }
            }
            odbc_free_result($result2);
            odbc_close ($Conx_DB);
         }
         odbc_free_result($result);
         odbc_close ($Conx_Web);    
    } 

我觉得我的代码很乱,但请记住我还在学习。

任何建议将不胜感激,谢谢!

【问题讨论】:

    标签: php html sql


    【解决方案1】:

    我怀疑"SELECT * FROM PRESTAMOS WHERE ALU_RUT=".$ALU_RUT 将返回多行(如果我理解正确,用户的所有行 - 非英文名称不容易)。

    您需要进一步限制搜索

    "SELECT * FROM PRESTAMOS WHERE ALU_RUT=".$ALU_RUT`." AND ART_TIPO=".$ART_TIPO
    

    或检查所有返回的行(即使用循环而不是仅第一行)。

    另外请注意,如果您将查询修改为仅返回给定用户和类型的行,则无需再次检查返回的行,只需检查是否存在行即可。在实际部署中,您很可能会改为使用

    "SELECT COUNT(1) FROM PRESTAMOS WHERE ALU_RUT=".$ALU_RUT`." AND ART_TIPO=".$ART_TIPO
    

    并检查非零返回计数 - 出于性能原因。

    【讨论】:

    • 嘿!正如你所说,它通过进一步限制搜索来工作,这很简单,但我看不到,非常感谢!
    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    相关资源
    最近更新 更多