如何在私有类的脚本中正确执行sql

问题描述:

调试处理表单数据的脚本:多个文本字段,两个文件上传(一个图像,另一个文档)。该脚本正在处理我的js文件,以便在上传前裁剪图像。如何在私有类的脚本中正确执行sql

我在下面的脚本中设置了两个sql语句,第一个将文本字段数据插入到数据库中,然后检索插入到的唯一并自动递增的行号($ id)。第二个sql语句应该将图像和文档的url插入到sql中,并放入第一个sql语句将数据提交到的同一行中。

第一个sql语句正在工作,并且这些文件在此脚本中保存到服务器。

第二个sql语句不起作用,我认为这是因为$ id的值不是从类CropAvatar之外传递的。

任何建议如何让第二个sql语句在这里执行?

<?php 
$title = $_POST['title']; 
$titlee = mysql_real_escape_string($title); 
$address = $_POST['address']; 
$addresse = mysql_real_escape_string($address); 
$sale_price = $_POST['sale_price']; 
$sale_pricee = mysql_real_escape_string($sale_price); 
require('../dbcon.php'); 
$sql="INSERT INTO listings (title, address, sale_price, date_added) VALUES ('$titlee', '$addresse', '$sale_pricee', now())"; 
mysqli_query($con,$sql); 
$id = mysqli_insert_id(); 
    class CropAvatar { 
     private $src; 
     private $data; 
     private $file; 
     private $dst; 
     private $type; 
     private $extension; 
     private $srcDir = '../0images/listimg/orig'; 
     private $dstDir = '../0images/listimg/mod'; 
     private $msg; 
function __construct($src, $data, $file, $id) { 
    $this -> setSrc($src); 
    $this -> setId($id); 
    $this -> setData($data); 
    $this -> setFile($file); 
    $this -> crop($this -> src, $this -> dst, $this -> data); 
} 
     private $id; 
     public function setId($id) { 
       $this->id = $id; 
} 
     private function setSrc($src) { 
      if (!empty($src)) { 
       $type = exif_imagetype($src); 

       if ($type) { 
        $this -> src = $src; 
        $this -> type = $type; 
        $this -> extension = image_type_to_extension($type); 
        $this -> setDst(); 
       } 
      } 
     } 
     private function setData($data) { 
      if (!empty($data)) { 
       $this -> data = json_decode(stripslashes($data)); 
      } 
     } 
     private function setFile($file) { 
      $errorCode = $file['error']; 

      if ($errorCode === UPLOAD_ERR_OK) { 
       $type = exif_imagetype($file['tmp_name']); 

       if ($type) { 
        $dir = $this -> srcDir; 

        if (!file_exists($dir)) { 
         mkdir($dir, 0777); 
        } 
        $currdate=date('YmdHis'); 
        $extension = image_type_to_extension($type); 
        $src = $dir . '/' . $currdate . $extension; 
        if ($type == IMAGETYPE_GIF || $type == IMAGETYPE_JPEG || $type == IMAGETYPE_PNG) { 

         if (file_exists($src)) { 
          unlink($src); 
         } 
         $result = move_uploaded_file($file['tmp_name'], $src); 
         $listing_img="http://www.website.com/0images/listimg/mod/" . $currdate . $extension; 
         $allowedExtsf = array("pdf"); 
         $tempf = explode(".", $_FILES["flyer"]["name"]); 
         $extensionf = end($tempf); 
         if (($_FILES["flyer"]["type"] == "application/pdf") 
         && ($_FILES["flyer"]["type"] <2000000000) 
         && in_array($extensionf, $allowedExtsf)) 
{ 
    $flyername=$_FILES["flyer"]["name"]; 

    if ($_FILES["flyer"]["error"] > 0) 
    { 
    echo "Return Code: " . $_FILES["flyer"]["error"] . "<br>"; 
    } 
     else 
     { 
      if (file_exists("../flyers/" . $_FILES["flyer"]["name"])) 
      { 
      echo $_FILES["flyer"]["name"] . " already exists. "; 
      } 
       else 
       { 
       move_uploaded_file($_FILES["flyer"]["tmp_name"],"../flyers/" . $_FILES["flyer"]["name"]); 
       } 
     } 
     $ad_link="http://www.website.com/flyers/" . $_FILES["flyer"]["name"]; 
     require('../dbcon.php'); 
$sql="update listings SET ad_link='$ad_link', listing_img='$listing_img' WHERE id=$ID"; 
mysqli_query($con,$sql); 
mysqli_close($con); 
} 
         if ($result) { 
          $this -> src = $src; 
          $this -> type = $type; 
          $this -> extension = $extension; 
          $this -> setDst(); 
         } 
        } 
       } 
      } 
     } 
     private function setDst() { 
      $dir = $this -> dstDir; 

      if (!file_exists($dir)) { 
       mkdir($dir, 0777); 
      } 

      $this -> dst = $dir . '/' . date('YmdHis') . $this -> extension; 
     } 
     private function crop($src, $dst, $data) { 
      if (!empty($src) && !empty($dst) && !empty($data)) { 
       switch ($this -> type) { 
        case IMAGETYPE_GIF: 
         $src_img = imagecreatefromgif($src); 
         break; 
        case IMAGETYPE_JPEG: 
         $src_img = imagecreatefromjpeg($src); 
         break; 
        case IMAGETYPE_PNG: 
         $src_img = imagecreatefrompng($src); 
         break; 
       } 
       if (!$src_img) { 
        $this -> msg = "Failed to read the image file"; 
        return; 
       } 
       $dst_img = imagecreatetruecolor(220, 220); 
       $result = imagecopyresampled($dst_img, $src_img, 0, 0, $data -> x, $data -> y, 220, 220, $data -> width, $data -> height); 
       if ($result) { 
        switch ($this -> type) { 
         case IMAGETYPE_GIF: 
          $result = imagegif($dst_img, $dst); 
          break; 
         case IMAGETYPE_JPEG: 
          $result = imagejpeg($dst_img, $dst); 
          break; 
         case IMAGETYPE_PNG: 
          $result = imagepng($dst_img, $dst); 
          break; 
        } 
        if (!$result) { 
         $this -> msg = "Failed to save the cropped image file"; 
        } 
       } else { 
        $this -> msg = "Failed to crop the image file"; 
       } 
       imagedestroy($src_img); 
       imagedestroy($dst_img); 
      } 
     } 
     private function codeToMessage($code) { 
      switch ($code) { 
       default: 
        $message = 'Unknown upload error'; 
      } 
      return $message; 
     } 
     public function getResult() { 
      return !empty($this -> data) ? $this -> dst : $this -> src; 
     } 
     public function getMsg() { 
      return $this -> msg; 
     } 
    } 
$crop = new CropAvatar($_POST['avatar_src'], $_POST['avatar_data'], $_FILES['avatar_file'], $id); 
    $response = array(
     'state' => 200, 
     'message' => $crop -> getMsg(), 
     'result' => $crop -> getResult() 
    ); 

    echo json_encode($response); 
?> 
+0

这段代码相当难读。修正您的缩进并将该类移到单独的块中,并且可能更容易解析出您正在执行的操作。 – miken32 2014-11-05 18:18:52

你混合DB库:

$sale_pricee = mysql_real_escape_string($sale_price); 
        ^---- 
mysqli_query($con,$sql); 
    ^--- 

mysql(没有 “我”)和mysqli(以 “我”)库是不能互换的,你不能像混合/匹配使用。既然你永远不会检查你的查询是否真的成功了,你简直可以忽略不计。坏坏坏假设。 ALWAYS假设事情会失败,检查失败,并将成功视为令人惊喜的事情。

假设你真的要使用“无我”的版本,则始终至少有这样的事情:

$result = mysql_query($sql) or die(mysql_error()); 
          ^^^^^^^^^^^^^^^^^^^^^^ 

而且注意,MySQL已经过时了。你不应该再使用它了,应该使用mysqli或PDO来代替。

而且在更新查询中直接使用$ _FILES的['name']参数,您仍然很容易受到sql注入攻击。