本帖最後由 Eason_____________ 於 2013-07-25 11:25:44 編輯
MySQL 資料庫
//做了一個手機上傳圖片到伺服器的功能。但是擷取到執行insert語句時都要執行兩次!
//index.php
doWork();$i->imageCheck();$sql="insert into json_bbs values('','".$gettitle."','".$getcontent."','".$i->iamgePath."','".time()."','')";mysql_query($sql);?>
//uploadImage.php
imageStauts = 'Error! Wrong HTTP method!';}if(is_array($file) && count($file)>0 && !empty($destination)){$this->fileArray = $file;$this->destination_folder = $destination;$this->imageName = $name;$this->imagePathTemp = $dbPath;$this->updateImage = $update;}else{$this->imageStauts = '初始化失敗';}}/** * 開始圖片上傳*/function imageStart(){if($this->imageStauts === 1){$this->imageCheck();}if($this->imageStauts === 1){$this->doWork();}}/*** * 圖片的檢查工作*/function imageCheck(){$file = $this->fileArray;//print_r($file);if(!is_uploaded_file($file['tmp_name']) && $this->imageStauts === 1){$this->imageStauts = '圖片不存在!'; }if(uploadImage::max_file_size < $file['size'] && $this->imageStauts === 1){$this->imageStauts = '檔案太大';} /*//檢查mime-typeif(!in_array(strtolower($file['type']), $this->uptypes) && $this->imageStauts === 1){$this->imageStauts = '不支援 '.$file['type'].' 類型的檔案';} *///防止在圖片中繼資料的Comment欄位中加入了php代碼//通過二進位匹配檢查$fileInfo = pathinfo($this->fileArray['name']);$fileType = strtolower($fileInfo['extension']);if(!in_array($fileType, $this->imageType) && $this->imageStauts === 1){$this->imageStauts = '不支援 '.$fileType.' 類型的檔案';} if(!file_exists($this->destination_folder) && $this->imageStauts === 1){mkdir($this->destination_folder,0777);//設定檔案許可權}}/** * * 開始圖片上傳的工作*/function doWork(){$fileName = $this->fileArray['tmp_name'];$fileSize = getimagesize($fileName);$fileInfo = pathinfo($this->fileArray['name']);$fileType = strtolower($fileInfo['extension']);$n = !empty($this->imageName) ? $this->imageName : date("Y_n_d_H_i_s");$destination = $this->destination_folder.$n.'.'.$fileType;//圖片本地路徑$this->imagePathTemp = $this->imagePathTemp.$n.'.'.$fileType;//將要儲存在資料庫的路徑//上傳圖片,若圖片存在不更新已有圖片if(file_exists($destination) && $this->imageStauts === 1 && $this->updateImage == 0){$this->imageStauts = '圖片已存在';}//上傳圖片,若圖片存在更新已有圖片if($this->imageStauts === 1 && $this->updateImage == 1){$deleteIMageDestination = $this->destination_folder.$n; //圖片儲存本地路徑,包含檔案名稱,但不包含圖片尾碼名if($this->deleteImage($deleteIMageDestination)){}else{$this->imageStauts = '刪除已存在圖片失敗';}}if(!move_uploaded_file($fileName, $destination) && $this->imageStauts === 1){$this->imageStauts = '傳輸錯誤';}if($this->imageStauts === 1){$this->iamgePath = $this->imagePathTemp;return $this->imageStauts;}}/** * 刪除圖片 * @param $path 圖片在本地的儲存路徑 * @return 成功返回1 失敗返回0*/function deleteImage($path){if(!empty($path)){foreach($this->imageType as $type){$_path = $path.'.'.$type;if(file_exists($_path)){//echo $_path;if(!unlink($_path)){$this->imageStauts = '刪除已存在圖片失敗';return 0;}}}return 1;}else{$this->imageStauts = '待刪除圖片路徑不可為空';return 0;}}}?>
回複討論(解決方案)
求幫忙看看!
index.php 代碼就只有這些?
是不是執行後又重新整理了?跳轉了?
index.php 代碼就只有這些?
是不是執行後又重新整理了?跳轉了?
還有就是js傳過來的 title 和 content
index.php 代碼就只有這些?
是不是執行後又重新整理了?跳轉了?
如果判斷一下index.php
if($_GET['title']!=''){$sql="insert into json_bbs values('','".$gettitle."','".$getcontent."','".$i->iamgePath."','".time()."','')";mysql_query($sql);}
在執行的話 就只插入一條資料了,但是擷取不到$i->iamgePath的值,$i->iamgePath就為空白。
不判斷的話 是插入以下兩條資料:
id title content images time uid
127 aaa yyyyy 1374722311 0
128 2013_7_25_11_18_32.jpg 1374722312 0
index.php 代碼就只有這些?
是不是執行後又重新整理了?跳轉了?
還有就是js傳過來的 title 和 content
js傳來的title和content?怎麼傳遞的
會不會js傳遞時執行了指令碼,提交上傳圖片時又執行了insert。所以是兩條記錄?
index.php 代碼就只有這些?
是不是執行後又重新整理了?跳轉了?
如果判斷一下index.php
if($_GET['title']!=''){$sql="insert into json_bbs values('','".$gettitle."','".$getcontent."','".$i->iamgePath."','".time()."','')";mysql_query($sql);}
在執行的話 就只插入一條資料了,但是擷取不到$i->iamgePath的值,$i->iamgePath就為空白。
不判斷的話 是插入以下兩條資料:
id title content images time uid
127 aaa yyyyy 1374722311 0
128 2013_7_25_11_18_32.jpg 1374722312 0
你這個一看就是2個不同操作執行得到的插入
你這2個動作,一個應該是更新動作,應該說是後來執行的那個動作只能是更新動作,不能是插入動作
所以你本身邏輯上出現了問題,插入2條資料屬於正常的
看看你的表單
看看你的表單
index.php 代碼就只有這些?
是不是執行後又重新整理了?跳轉了?
還有就是js傳過來的 title 和 content
js傳來的title和content?怎麼傳遞的
會不會js傳遞時執行了指令碼,提交上傳圖片時又執行了insert。所以是兩條記錄?
json傳遞的
看看你的表單
斑竹說表單,你給資料庫。。
是表單部分的代碼和js部分的代碼。
看看你的表單
斑竹說表單,你給資料庫。。
是表單部分的代碼和js部分的代碼。
ajax?
傳遞過來不就執行insert了嗎?
提交表單又執行一次。
不就剛好兩條資料麼
看看你的表單
x 添加圖片 發布 從手機相簿選擇 拍照 取消
看看你的表單
斑竹說表單,你給資料庫。。
是表單部分的代碼和js部分的代碼。
ajax?
傳遞過來不就執行insert了嗎?
提交表單又執行一次。
不就剛好兩條資料麼
如果我判斷一下
就是 if($_GET["title"]!=''){
}
就執行了一次。
但是插入的資料 $i->iamgePath的值就為空白 這個是怎麼回事?
你的文字提交和檔案上傳本身就是分開的
你的文字提交和檔案上傳本身就是分開的
嗯 這是我用appcan做的手機app.
你的文字提交和檔案上傳本身就是分開的
現在插入兩條的問題解決了 就是插入的時候 擷取不到$i->iamgePath的值。
但是當insert 是兩條的時候 $i->iamgePath就會有。
這是在提交文字
105 var url = 'http://localhost/json/bbs/index.php?title='+fbtitle+'&content='+fbcontent;
106 $.getJSON(url,function(data){
這是在提交檔案
152 uexUploaderMgr.uploadFile(1,upload_image_url,"filename",4);
雖然在文本提交前就啟動了檔案提交
102 uexUploaderMgr.createUploader(1,uploadHttp);
但一般檔案上傳總要慢於文本提交,所以你能先收到 get 資料,後收到 上傳檔案
但如果情況恰恰相反呢?
你的文字提交和檔案上傳本身就是分開的
現在插入兩條的問題解決了 就是插入的時候 擷取不到$i->iamgePath的值。
但是當insert 是兩條的時候 $i->iamgePath就會有。
給你一個思路和建議,其實不少網站也在用,就是:
圖片部分用iframe,在ajax提交的是時候先執行圖片部分,然後得到返回正常的圖片地址(這裡還不插入資料庫,純粹上傳圖片)以後再執行再執行文字表單部分,這時候圖片地址是用一個參數傳,這樣就可以和文字一起插入資料庫了,也就只有一條資料了
你的文字提交和檔案上傳本身就是分開的
現在插入兩條的問題解決了 就是插入的時候 擷取不到$i->iamgePath的值。
但是當insert 是兩條的時候 $i->iamgePath就會有。
給你一個思路和建議,其實不少網站也在用,就是:
圖片部分用iframe,在ajax提交的是時候先執行圖片部分,然後得到返回正常的圖片地址(這裡還不插入資料庫,純粹上傳圖片)以後再執行再執行文字表單部分,這時候圖片地址是用一個參數傳,這樣就可以和文字一起插入資料庫了,也就只有一條資料了
謝謝兩位版主給的思路。 我在試一試