本帖最後由 Eason_____________ 於 2013-07-25 16:41:04 編輯
資料庫
//現在的問題是如果沒有上傳檔案,只上傳 文字。 就能擷取到$_GET的值。如果上傳了檔案 就不能擷取。 具體代碼請看下面。是json傳值。
//html
x 添加圖片 發布 從手機相簿選擇 拍照 取消
//index.php
imageStart();$gettitle=$_GET['title'];$getcontent=$_GET['content'];if($_GET['imgshows']=='none'){//如果沒有檔案 就執行這一句$sql="insert into json_bbs values('','".$gettitle."','".$getcontent."','','".date()."','')";mysql_query($sql);}else{if($i->imageStauts == 1){//有檔案 就執行這一句//就是這裡擷取不到值$sql="insert into json_bbs values('','".$gettitle."','".$getcontent."','','".time()."','')";mysql_query($sql);}}?>
回複討論(解決方案)
//uploadImage.php
/**
*
* 圖片上傳類
* @author ChenYue
*
* @param $mageStauts 圖片上傳狀態 1為正常狀態
* @param $iamgePath 圖片上傳成功儲存在資料庫的路徑
* @param $imagePathTemp 臨時儲存圖片上傳成功儲存在資料庫的路徑
* @param $destination_folder 上傳檔案路徑
* @param $imageName 上傳的圖片名(可自訂)
* @param $fileArray 上傳的圖片資訊數組
* @param $updateImage 判斷是否更新原有圖片 0表示不更新 , 1 表示更新
* @param $uptypes 支援上傳的圖片類型
* @param max_file_size 支援上傳的圖片最大類型
* @param imageType 圖片的類型
*
*/
class uploadImage{
public $imageStauts = 1;
public $iamgePath='';
private $imagePathTemp = "";
private $destination_folder;
private $imageName;
private $fileArray;
private $updateImage = 0;
private $uptypes = array(
'image/jpg',
'image/jpeg',
'image/png',
'image/x-png');
private $imageType = array('jpg','jpeg','png');
const max_file_size=2000000;
/**
* 建構函式
* @param $file 上傳的圖片資訊數組
* @param $destination 上傳檔案路徑
* @param $name 上傳的圖片名(可自訂)沒定義,上傳後的圖片名為time()
* @param $dbPath 圖片上傳成功儲存在資料庫的路徑
* @param $update 判斷是否更新原有圖片 0表示不更新 , 1 表示更新 。 更新會把已經存在的圖片替換掉
*/
function __construct($file,$destination="",$name="",$dbPath="",$update=0){
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-type
if(!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 : time();
$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;
}
}
}
?>
還是那個問題?
怎麼改的圖片不能上傳了?
還是那個問題?
怎麼改的圖片不能上傳了?
現在圖片能上傳了,也能寫入資料庫了。 就是 如果有檔案和圖片一起上傳的話。
就擷取不到$_GET的值
還是那個問題?
怎麼改的圖片不能上傳了?
是類有問題嗎?
現在的過程是:
如果值上傳文字的話, 就直接插入資料庫。
如果上傳了有文字圖片的話,等圖片上傳完成然後在執行插入資料庫的操作。
if($i->imageStauts == 1) 這個是判斷圖片是否上傳完成的
先確認代碼是否走到了這個if塊中,如果都沒到這個塊中,你怎麼知道get的值沒取到呢?
if($i->imageStauts == 1){
echo "aaaaaa";
}
還有,你的代碼跟之前的不大一樣的。
$i->doWork();
$i->imageCheck();
這些邏輯不要了?
先確認代碼是否走到了這個if塊中,如果都沒到這個塊中,你怎麼知道get的值沒取到呢?
if($i->imageStauts == 1){
echo "aaaaaa";
}
還有,你的代碼跟之前的不大一樣的。
$i->doWork();
$i->imageCheck();
這些邏輯不要了?
$i->imageStart();
替代了:
$i->doWork();
$i->imageCheck();
if($i->imageStauts == 1)
能走
都能插入資料庫。
圖片地址,都能插入資料庫,就是get擷取的值 不能插入到資料庫,
一個低級錯誤
if($i-> imageStauts == 1)
是Status
public $imageStauts = 1;
我類裡面也是這樣寫的
一個低級錯誤
if($i-> imageStauts == 1)
是Status
public $imageStauts = 1;
我類裡面也是這樣寫的
一個低級錯誤
if($i-> imageStauts == 1)
是Status
就是找不到原因,如果上傳圖片 始終都擷取不到get的值 不上傳圖片就行。。。。。
一個低級錯誤
if($i-> imageStauts == 1)
是Status
public $imageStauts = 1;
我類裡面也是這樣寫的
...是看走眼了。。
一個低級錯誤
if($i-> imageStauts == 1)
是Status
如果不加這個判斷 if($i->imageStauts == 1) 就能得到get值
加上調試:
else{
echo "to else";
if($i->imageStauts == 1){
echo "to status";
$sql="insert into json_bbs values('','".$gettitle."','".$getcontent."','','".time()."','')";
mysql_query($sql);
}
}
然後看看是哪塊的問題。
一個低級錯誤
if($i-> imageStauts == 1)
是Status
如果不加這個判斷 if($i->imageStauts == 1) 就能得到get值
那不是沒得到值,而是imageStauts不等於1,根本就沒有走到這個代碼塊。
一個低級錯誤
if($i-> imageStauts == 1)
是Status
如果不加這個判斷 if($i->imageStauts == 1) 就能得到get值
那不是沒得到值,而是imageStauts不等於1,根本就沒有走到這個代碼塊。
但是我把 $sql="insert into json_bbs values('',' ".$gettitle."',' ".$getcontent."','','".time()."','')"; 加紅的地方換成 隨便什麼字元 就能插入到資料庫
if($i->imageStauts == 1) 這一步是通過了的。
這個是取消了get值 隨便輸入的字元:
這個是取的get值
一個低級錯誤
if($i-> imageStauts == 1)
是Status
如果不加這個判斷 if($i->imageStauts == 1) 就能得到get值
那不是沒得到值,而是imageStauts不等於1,根本就沒有走到這個代碼塊。
但是我把 $sql="insert into json_bbs values('',' ".$gettitle."',' ".$getcontent."','','".time()."','')"; 加紅的地方換成 隨便什麼字元 就能插入到資料庫
先把調試代碼加上,sql也echo出來,看看結果。
先把調試代碼加上,sql也echo出來,看看結果。
結果在上面。
就是說圖片還是可以上傳的了,對吧?
你的文字和圖片是分別上傳的,所以你的接收程式被執行了兩次
一次是只有 get 過來的文字資料
一次是只有 upload 過來的圖片
你需要做到的是:能識別這兩次資料是來自同一瀏覽器的同一次提交(看代碼圖片是在提交的時候選擇的,對吧?)
嗯,你的 uexUploaderMgr.createUploader(1,uploadHttp); 放錯位置了,原來是對的
為了識別是來自同一瀏覽器,你可以使用 cookie 最好是 session 方便選項組
為了識別是來自同一次提交,你可以在 url 上附加序號
大致是這個樣子
var uploadHttp = "http://localhost/json/bbs/index.php";var num = 0;function upload(){ var url = uploadHttp + '?t=' + num; if($$("fb-title").value!='' && $$("fb-content").value!='' && document.getElementById("showPic").src==""){ uexUploaderMgr.createUploader(1,url); var fbtitle = $$("fb-title").value; var fbcontent = $$("fb-content").value; url += '&title='+fbtitle+'&content='+fbcontent+"&imgshows=none"; $.getJSON(url,function(data){ });....
session_start();if(isset($_SESSION['t']) && $_SESSION['t'] == $_GET['t']) { //同一次提交 //根據傳入的資料,修改資料庫}else { $_SESSION['t'] = $_GET['t']; //根據傳入的資料,插入資料庫 $_SESSION['last'] = 上一次插入的 id ,用作修改是的憑據}
就是說圖片還是可以上傳的了,對吧?
你的文字和圖片是分別上傳的,所以你的接收程式被執行了兩次
一次是只有 get 過來的文字資料
一次是只有 upload 過來的圖片
你需要做到的是:能識別這兩次資料是來自同一瀏覽器的同一次提交(看代碼圖片是在提交的時候選擇的,對吧?)
嗯,你的 uexUploaderMgr.createUploader(1,uploadHttp); 放錯位置了,原來是對的
為了識別是來自同一瀏覽器,你可以使用 cookie 最好是 session 方便選項組
為了識別是來自同一次提交,你可以在 url 上附加序號
大致是這個樣子
var uploadHttp = "http://localhost/json/bbs/index.php";var num = 0;function upload(){ var url = uploadHttp + '?t=' + num; if($$("fb-title").value!='' && $$("fb-content").value!='' && document.getElementById("showPic").src==""){ uexUploaderMgr.createUploader(1,url); var fbtitle = $$("fb-title").value; var fbcontent = $$("fb-content").value; url += '&title='+fbtitle+'&content='+fbcontent+"&imgshows=none"; $.getJSON(url,function(data){ });....
session_start();if(isset($_SESSION['t']) && $_SESSION['t'] == $_GET['t']) { //同一次提交 //根據傳入的資料,修改資料庫}else { $_SESSION['t'] = $_GET['t']; //根據傳入的資料,插入資料庫 $_SESSION['last'] = 上一次插入的 id ,用作修改是的憑據}
這樣子不行,圖片和文字 是一起上傳的
if($$("fb-title").value!='' && $$("fb-content").value!='' && document.getElementById("showPic").src=="")//這個是判斷有沒有圖片 這個是沒有圖片 直接就插入資料庫了
if($$("fb-title").value!='' && $$("fb-content").value!='' && document.getElementById("showPic").src!="")//這個是有圖片的 有圖片 就執行上傳圖片的操作。
執行了圖片的操作後,
if($i->imageStauts == 1) 判斷圖片是否是完成了上傳。
如果完成了上傳,就把文字和圖片一起插入資料庫,不是分開執行的。
現在就是 if($i->imageStauts == 1){ 在這裡面不能擷取GET的值。 如果把 $_GET['title']換成隨便什麼字元都行}
要怎麼說你才能明白是分兩次上傳的呢?
這是上傳文字,get方式,不可能上傳檔案。上傳檔案至少需要是post方式
$.getJSON(url,function(data){
這是建立一個上傳組件,沒有表單只能用組件上傳
uexUploaderMgr.createUploader(1,uploadHttp);
補充一下
正因為是分作兩次提交的,所以才會有你另一個文章中的兩條記錄的問題
應該說這現在的代碼遠沒有你另一帖的代碼合理