为准备好的语句创建插入查询

Posted

技术标签:

【中文标题】为准备好的语句创建插入查询【英文标题】:Coverting insert query to a prepared statment 【发布时间】:2020-10-27 00:53:42 【问题描述】:

我一直在努力处理这个插入查询,因为它不起作用并且没有给出任何错误,但是类似的查询在其他表中工作得很好,只是这个不工作 我一直在尝试将其转换为 pdo 准备好的语句,但如果有人可以帮助此转换将非常有帮助,我将无法做到这一点

//med_en_name

 $med_en_name = $_POST["med_en_name"];

            //med_ar_name

 $med_ar_name = $_POST["med_ar_name"];

            //lat_name

 $lat_name = $_POST["lat_name"];

            //che_name

 $che_name = $_POST["che_name"];

            //med_desc

 $med_desc = $_POST["med_desc"];

                //med_note

 $med_note = $_POST["med_note"];

                //act_mat

 $act_mat = $_POST["act_mat"];

                //rea_use

 $rea_use = $_POST["rea_use"];

                //side_eff

 $side_eff = $_POST["side_eff"];

                //contraind

 $contraind = $_POST["contraind"];

                //price_wz_dis

 $price_wz_dis = $_POST["price_wz_dis"];

                //price_wzo_dis

 $price_wzo_dis = $_POST["price_wzo_dis"];

                //quan_for_prod

 $quan_for_prod = $_POST["quan_for_prod"];

                //pack_for_prod

 $pack_for_prod = $_POST["pack_for_prod"];

                //med_class

 $med_class = $_POST["med_class"];

                //med_store

 $med_store = $_POST["med_store"];

                //med_type

 $med_type = $_POST["med_type"];

                //med_comp

 $med_comp = $_POST["med_comp"];

                //med_chk

 $med_chk = $_POST["med_chk"];

                //med_start_date

$med_start_date=date("Y-m-d", strtotime($_POST['med_start_date']));

                //med_end_date

 $med_end_date = date("Y-m-d", strtotime($_POST["med_end_date"]));

                //med_rec_date

 $med_rec_date =  date("Y-m-d", strtotime($_POST["med_rec_date"]));

                //med_flag

 $med_flag = $_POST["med_flag"];

if(!empty($_FILES['upload_Product']['name'] ))
 

 $valid_formats = array("jpg", "png", "gif", "bmp","jpeg","JPG","PNG","GIF","BMP","mp3","MP3","mp4","MP4","3gp","3GP");
 $uploaddir = "uploads/"; //image upload directory

        $filename = stripslashes($_FILES['upload_Product']['name']);
        $size=filesize($_FILES['upload_Product']['tmp_name']);
        //get the extension of the file in a lower case format
          $ext = getExtension($filename);
          $ext = strtolower($ext);
         if(in_array($ext,$valid_formats))
         
           if ($size < (MAX_SIZE*1024))
             
           $image_name=time().$filename;
           $newname=$uploaddir.$image_name;
              if (move_uploaded_file($_FILES['upload_Product']['tmp_name'], $newname))
              

  mysql_query("INSERT INTO `id14270028_it_pharma`.`pha_medicine` (`M_ID`, `MedicineName`, `LatinName`, `ChemicalName`, `Type_ID`, `ActiveMaterial`, `Medicine_MD_ID`, `store_id`, `ReasonForUsing`, `SideEffects`, `MedicinePhoto`, `Contraindications`, `PacketsNum`, `Description`, `Notes`, `PriceWZdiscount`, `PriceWZOUTdiscount`, `AllPacketswzQTY`, `Company_ID`, `medicine_flag`, `created_by`, `creation_date`, `prod_start_date`, `prod_end_date`, `prod_rec_date`, `ArabicName`, `ChkDrugsTable`) VALUES (NULL, '".$med_en_name."', '".$lat_name."', '".$che_name."', '$med_type', '".$act_mat."', '$med_class',  '$med_store','".$rea_use."', '".$side_eff."','".$image_name."','".$contraind."', '$quan_for_prod', '".$med_desc."', '".$med_note."', '$price_wz_dis', '$price_wzo_dis', '$pack_for_prod', '".$med_comp."', '".$med_flag."', '$user_id', '$current_date', '".$med_start_date."', '".$med_end_date."', '".$med_rec_date."', '".$med_ar_name."', '".$med_chk."');");


              


            else

             

                     echo '<span class="imgList">You have exceeded the size limit! so moving unsuccessful! </span>';
             
              
              else
              
            echo '<span class="imgList">You have exceeded the size limit!</span>';
              
          
          else
         
             echo '<span class="imgList">Unknown extension!</span>';
         
        

 else
 
mysql_query("INSERT INTO `id14270028_it_pharma`.`pha_medicine` (`M_ID`, `MedicineName`, `LatinName`, `ChemicalName`, `Type_ID`, `ActiveMaterial`, `Medicine_MD_ID`, `store_id`, `ReasonForUsing`, `SideEffects`, `MedicinePhoto`, `Contraindications`, `PacketsNum`, `Description`, `Notes`, `PriceWZdiscount`, `PriceWZOUTdiscount`, `AllPacketswzQTY`, `Company_ID`, `medicine_flag`, `created_by`, `creation_date`, `prod_start_date`, `prod_end_date`, `prod_rec_date`, `ArabicName`, `ChkDrugsTable`) VALUES (NULL, '".$med_en_name."', '".$lat_name."', '".$che_name."', '$med_type', '".$act_mat."', '$med_class',  '$med_store','".$rea_use."', '".$side_eff."','0','".$contraind."', '$quan_for_prod', '".$med_desc."', '".$med_note."', '$price_wz_dis', '$price_wzo_dis', '$pack_for_prod', '".$med_comp."', '".$med_flag."', '$user_id', '$current_date', '".$med_start_date."', '".$med_end_date."', '".$med_rec_date."', '".$med_ar_name."', '".$med_chk."');");
  

【问题讨论】:

????如果您刚刚开始使用 php 并想构建应用程序,我强烈建议您查看各种 development frameworks 以查看是否可以找到适合您的风格和需要。它们有多种风格,从 Fat-Free Framework 这样的轻量级到像 Laravel 这样的更全面。这些为您提供了具体的工作示例以及如何编写代码和组织项目文件的指导。 提示:如果您正确命名占位符,则只需 execute($_POST)。这意味着您不需要声明无数不同的变量。 好吧,你根本没有检查 mysql 错误,所以难怪你没有收到任何错误...... 值得注意的是,这段代码极易受到 SQL 注入错误的影响,因此如果这是在公共服务器上,这会使您面临极高的风险。 @tadman 是的,我是 php 新手,正在为一个大学项目做这个应用程序,所以我遇到了很多问题,这个我自己无法解决,我会看看进入您提供的链接,谢谢。 【参考方案1】:

PDO 的粗略方法是用: 命名占位符替换字符串中的所有$ 变量,并删除所有不必要的引号,语句绑定会为您处理这些。例如:

$sth = $conn->prepare("INSERT INTO `pha_medicine` (`MedicineName`, ...) VALUES (:med_en_name, ...)");

值得注意的是,不要将M_ID 列为具有NULL 值的列,而是跳过该列。同样,在代码中执行 SQL 时省略 ; 语句分隔符。这仅在交互式 SQL shell 中是必需的。

准备好后,您可以使用以下变量执行:

$sth->execute($_POST);

如果您花时间确保您的占位符名称与 $_POST 中的变量完全匹配。

【讨论】:

以上是关于为准备好的语句创建插入查询的主要内容,如果未能解决你的问题,请参考以下文章

在准备好的语句中不向列 X 插入值的逻辑 [重复]

单例连接 + 单例准备好的语句

带有准备好的语句的 PostgreSQL 内部查询

在使用准备好的语句执行插入查询后获取自动增量 ID

准备好的语句的 setString 不起作用

如何为java准备好的语句插入使用表名变量[重复]