我遇到以下问题:我在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;
}
答案 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";
}