在数据库中找不到记录

时间:2019-03-08 22:33:53

标签: php mysql sql

我遇到以下问题:我在URL中收到一个GET变量。如果变量GET到达,则将变量的内容发送到控制器。

我的控制器首先带来整个“ sales”表,然后在列中查找具有与GET变量相同内容的记录。最后,我更新找到的记录的状态。

但是什么也没发生,而且我不知道自己在做什么错。

我留下代码:

接收变量GET的PHP文件:

if(isset( $_GET['number'])){

$number = $_GET['number'];

$response = CartController::ctrShowSales($number);

echo $response;

}

PHP控制器:

static public function ctrShowSales($number){

    $table = "sales";

    $respuesta = CartModel::mdlShowSales($table);

    $find = 0;

    foreach ($response as $key => $value) {

        if ($value["number"] == $number) {

            $find = 1;
            $id = $value["id"];

            break;

        } 

    }

    if ($find == 1){

        $response2 = CartModel ::mdlUpdateRecord($table, $id);
        return $response2;

    } else { return "Did not find";}

}

PHP模型:

static public function mdlShowSales($table){

    $stmt = Conection::conect()->prepare("SELECT * FROM $table");

    $stmt -> execute();

    return $stmt -> fetch();

    $stmt -> close();

    $tmt =null;

}

static public function mdlUpdateRecord($table, $id) {

    $stmt = Conection::conect()->prepare("UPDATE $table SET status = :status WHERE $id = :$id");

            $stmt->bindParam(":id", $id, PDO::PARAM_INT);
    $stmt->bindParam(":status", "Verified", PDO::PARAM_STR);

    if($stmt -> execute()){

        return "ok";

    }else{

        return "error"; 

    }

    $stmt -> close();

    $stmt = null;

}

2 个答案:

答案 0 :(得分:2)

除了其他答案外,我还会将此简单方法添加到您的模型中,

protected static $tables  = ['sales'];

final static public function ckTable($table){
     if(false !== ($index = array_search($table, static::$tables, true))){
         return $tables[$index]; //return your table value
     }
     throw new Exception('Unknown Table');
}

static public function mdlShowSales($table){
       //here you can clearly see the table is being handled
       $safeTable = self::ckTable($table); //use a different var here


       $stmt = Conection::conect()->prepare("SELECT * FROM $safeTable");
       ....

      //or $stmt = Conection::conect()->prepare("SELECT * FROM ".self::ckTable($table));
}

现在,您只有在控制器中对此进行了硬编码的事实:

$table = "sales";

只需要一天在控制器中犯此错误

//here you cannot tell if this is safe to do or not as you cannot see how the query is done.
static public function somepage($table){
      $respuesta = CartModel::mdlShowSales($table);
}

即使您准备查询,您也可以使用SQL Injection。

现在这是不可能的,我们应该做到这一点。

此外,这基本上就是您正在做的事情:

//everything under PHP Controller can be done with this sql:
SELECT id FROM sales WHERE number = :number LIMIT 1
/*
  SELECT * FROM sales
foreach ($response as $key => $value) {   
        if ($value["number"] == $number) { //-- WHERE number = :number
            $find = 1;
            $id = $value["id"]; //-- SELECT id
            break; //-- LIMIT 1
        } 
    }
 */

//mdlUpdateRecord
UPDATE sales SET status = :status WHERE id = :id

那么为什么不这样做

UPDATE sales SET status = :status WHERE number = :number LIMIT 1

基本上,我只是将您的代码改写为SQL,您可以根据需要进行操作。我认为,如果您的订单不同,并且您有多个number行具有相同的值,那么订购1可能会成为问题。但是我不知道您的数据库肯定要说什么,原始代码也是如此。

答案 1 :(得分:1)

更改模型以获取关联的结果:

static public function mdlShowSales($table){

    $stmt = Conection::conect()->prepare("SELECT * FROM $table");

    $stmt -> execute();

    return $stmt -> fetch(PDO::FETCH_ASSOC);

    $stmt -> close();

    $tmt =null;

}

然后是您的控制器:

static public function ctrShowSales($number){

    $table = "sales";

    $respuesta = CartModel::mdlShowSales($table);



    foreach ($response as $value) {

        if ($value["number"] == $number) {

           $response2 = CartModel ::mdlUpdateRecord($tabla, $id);
    return $respuesta2;

        } 

    }

     return "Did not find";

}