Въпрос за UPDATE на поле(та) в MySQL

vinsbg

Registered
Имам страница, където ъпдейтвам title, alt и текст под снимка в базата.
Сега както е ако искам да променя примерно само едно от 3-те, като във формата оставя другите 2 празни .. променя и другите 2 на празни, защото са празни във формата.
Как мога да избегна това? Сещам се за варианта, когато зареждам формата за редакция да зареждам и данните в полетата, но как точно?
Ето я формата
Код:
<form action="" method="post" enctype="multipart/form-data">
                Изберете категория
             <select name="img_category">
                <option value="1">Автомобили</option>
                <option value="2" >Животни</option>
            </select><br/><br />
                Текст под снимката
                <input type="text" name="caption" /><br /><br />
                Alt текст за снимката
                <input type="text" name="alt" /><br /><br />
                Title за снимката
                <input type="text" name="title" /><br /><br />
                <input type="file" name="userfile" /><br /><br />
                <input type="submit" name="submit" id="submit" value="Промени" /><br /><br />
                </form>
така ъпдейтвам инфото в базата
Код:
    $id =$_GET['id'];
    $category = $_POST['img_category'];
    $caption = $_POST['caption'];
    $alt = $_POST['alt'];
    $title = $_POST['title'];

    $query = "UPDATE images SET img_category = '$category', caption = '$caption', alt='$alt', title = '$title' WHERE id = '$id'";

    $result = mysqli_query($con, $query) or die("Error in query: ".mysqli_error($con));
Ясно ми е защо ако променя само едно от полетата другите стават празни в базата.
Та как мога да заредя формата със заредени данни от базата в полетата и?
 
нещо от сорта на:

PHP:
<?PHP 

$id = $_GET['id']; 
if (!$_POST['submit']) 
{ 

$our = mysql_query("SELECT img_category,caption,alt,title FROM images where id='$id' "); 
while($r=mysql_fetch_array($our)){ 

  


echo "

<form action="" method="post" enctype="multipart/form-data"> 
                Изберете категория 
             <select name="img_category"> 
                <option value="1">Автомобили</option> 
                <option value="2" >Животни</option> 
            </select><br/><br /> 
                Текст под снимката 
                <input type="text" name="caption" <?PHP echo"$r[caption]"; ?> /><br /><br /> 
                Alt текст за снимката 
                <input type="text" name="alt" value="<?PHP echo"$r[alt]"; ?>" /><br /><br /> 
                Title за снимката 
                <input type="text" name="title" value="<?PHP echo"$r[title]"; ?>" /><br /><br /> 
                <input type="file" name="userfile"   /><br /><br /> 
                <input type="submit" name="submit" id="submit" value="Промени" /><br /><br /> 
                </form> 

<? 

} 
} 
else{ 


 $id =$_GET['id']; 
    $category = $_POST['img_category']; 
    $caption = $_POST['caption']; 
    $alt = $_POST['alt']; 
    $title = $_POST['title'];


$query = "UPDATE images SET img_category = '$category', caption = '$caption', alt='$alt', title = '$title' WHERE id = '$id'"; 

    $result = mysqli_query($con, $query) or die("Error in query: ".mysqli_error($con)); 
} 
?>
 
Може да пробваш нещо от сорта :wink:

PHP:
	//някаква защита...... може да го праснеш това в DB_Config fajla...
		foreach($_GET as $key => $val)
		{
			if(is_array($val))
			{
				foreach($val as $sub_key => $sub_val )
				{
					$_GET[$sub_key]= htmlspecialchars($sub_val, ENT_QUOTES);
				}
			}
			else
			{
				$_GET[$key]= htmlspecialchars($val, ENT_QUOTES);
			}
		}
		foreach($_POST as $key => $val)
		{
			if(is_array($val))
			{
				foreach($val as $sub_key => $sub_val )
				{
					$sub_val= htmlspecialchars($sub_val, ENT_QUOTES);
					$_POST[$sub_key]= str_replace('\r', "\r", $sub_val);
					$_POST[$sub_key]= str_replace('\n', "\n", $sub_val);
				}
			}
			else
			{
				$val= htmlspecialchars($val, ENT_QUOTES);
				$_POST[$key]= str_replace('\r', "\r", $val);
				$_POST[$key]= str_replace('\n', "\n", $val);
			}
		}
	//някаква защита......

	//проверка за празни стойности
	function chek_empty($strVar, $strName, &$srtError)
	{
		if( $strVar == '' || $strVar == false || $strVar == Null || Empty($strVar) )
		{
			$strError = "Полето $strName е некоректно попълнено";
		}
	}

	$strError = '';
	$strForm = '';
	$strBr = "<br />";
	$img_query = mysql_query("SELECT img_category, caption, alt, title FROM images WHERE id =$id ") or die (mysql_error());
	$img_row = mysql_fetch_assoc($img_query);

	//тук си добавяш селектовете ;)
	$arrImg_Category = array('1' => 'Автомобили' , '2' => 'Животни', );

	$strForm .= "<form action='' method='post' enctype='multipart/form-data'>";

    $strForm .=		"Изберете категория";
	$strForm .=		"<select name='img_category'>";
		
		//Обхохдаж си масива със селектовете
		foreach ($arrImg_Category as $key => $value) 
		{	
			if( $key == $img_row['img_category'] )
			{
				$slected = "selected=select";
			}
			else
			{
				$slected = "";
			}
			$strForm .= "<option value='${key}' ${slected} >${value}</option>";
		}

    $strForm .= 	"</select>";
	$strForm .= $strBr;
    $strForm .= $strBr;

    $strForm .= 	"Текст под снимката";
    $strForm .= 	"<input type='text' name='caption' value='${img_row['caption']}' />";
    $strForm .= $strBr;
    $strForm .= $strBr;

    $strForm .= 	"Alt текст за снимката";
    $strForm .= 	"<input type='text' name='alt' value='${img_row['alt']}' />";
    $strForm .= $strBr;
    $strForm .= $strBr;

    $strForm .= 	"Title за снимката";
    $strForm .= 	"<input type='text' name='title' value='${img_row['title']}' />";
	$strForm .= $strBr;
    $strForm .= $strBr;

    $strForm .= 	"<input type='file' name='userfile' value='${img_row['userfile']}' />";
    $strForm .= $strBr;
    $strForm .= $strBr;

    $strForm .= 	"<input type='submit' name='submit' id='submit' value='Промени' />";
    $strForm .= 	"<input type='hidden' name='chek' value='true' />";

    $strForm .= $strError;

    $strForm .= $strBr;
    $strForm .= $strBr;

    $strForm .=	"</form>";

	if( isset($_POST['chek']) )
	{
		/*
		Сигорен ли си че ще вземаш данни от $_GET масивът, 
		Формата мята всичко в $_POST ?! ако ще е пост си оправи $_GET['id'] то.. на пост
		*/

		$intId = (int)$_GET['id'];
		$strCategory = $_POST['img_category'];
		$strCaption = $_POST['caption'];
		$strAlt = $_POST['alt'];
		$strTitle = $_POST['title'];

		// тук слагаш полетата които искаш задълйително да има данни в тях!
  		chek_empty( $strCategory, 'Категория', $strError);
  		chek_empty( $strCaption, 'Текст', $strError);
  		chek_empty( $strAlt, 'Alt', $strError);
  		chek_empty( $strTitle, 'Title', $strError);

  		if( $strError == '' )
  		{
  			$query = mysqli_query($con,"UPDATE images SET img_category = '$strCategory', caption = '$strCaption', alt='$strAlt', title = '$strTitle' WHERE id = '$intId'") or die("Error in query: ". mysqli_error($con));
  			
  			if( $query == true )
  			{
  				//страницата към която ще те мете ако сичко е ОК
  				Header('Location: http://страница'); exit();
  			}
  		}

	}
	
	echo $strForm;
    // нямам каде да го пробвам дали работи виш и кажи как е, ако има някаде грешка прощавай или някой да я коригира... ;)
 
Благодаря ви. Ще ги пробвам при първа възможност и ще пиша, какво е станало! :?:
 
Добре де, направи проверка, ако са празни полетата да не ги променяш и тях.
Другия вариант какво сложно има? За промяна така или иначе взимаш id-то на снимката.
Взимаш информацията за нея и просто пълниш полетата с нужната информация.

@stankata90 с какво твоите проверки в check_empty() заместват empty() ? Самата функция empty() прави дори повече проверки.
 
Струва ми се по удачно така, вместо да пиша else if и условие за сяко следващо поле. Функцията връща стойност на $strError по референция, а когато $strError стане true начи има грешка. :wink:
 
stankata90 каза:
Може да пробваш нещо от сорта :wink:

PHP:
	......
Само един въпрос. Когато променя
Код:
$intId = (int)$_GET['id'];
на 
$intId = (int)$_POST['id'];
не работи коректно. Искам да кажа, че примерно категорията не иска да я смени. И ако изтрия някое после примерно 'title' да остане празно не го оставя празно, а си остава, което е било. С $_GET го няма това и си работи коректно.
 
пропуснал съм да добавя няколко реда нека стане така:
PHP:
	$intId = (int)$_GET['id'];
	$strError = '';
	$strForm = '';
	$strBr = "<br />";
	$img_query = mysql_query("SELECT id, img_category, caption, alt, title FROM images WHERE id =$intId ") or die (mysql_error());

	$img_row = mysql_fetch_assoc($img_query);

по-надолу в формата ще добавим и скрито поле
PHP:
    $strForm .= 	"<input type='submit' name='submit' id='submit' value='Промени' />";

    $strForm .= 	"<input type='hidden' name='chek' value='true' />";
    $strForm .= 	"<input type='hidden' name='id' value='${img_row['id']}' />";

и вече на събмитнатата форма
PHP:
		$intId = (int)$_POST['id'];
		$strCategory = $_POST['img_category'];
		$strCaption = $_POST['caption'];
		$strAlt = $_POST['alt'];
		$strTitle = $_POST['title'];

предефинирал съм $intId от пост масивът за да е малко по пригледно като отидеш на променливите. Иначе разликата дали ще дефинираш $intId = (int)$_GET['id']; още в началото на страницата и после отще един път след формата е никаква.
 
С тези промени не променя нищо в базата. Благодаря ти много за помощта... аз ще си го донаглася вече. :?:
 
Тогава го остави $intId да идва от гет но ще си го знаеш че само то е от гет масива ефекта ще е същия :wink:
 

Back
Горе