تو پروژه ی mvc تو جدول category چنین رابطه ای رو ایجاد کردم :
`blog`.`category`, CONSTRAINT `category_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
در بخشی از پروژه در قسمت ویرایش دسته ها ، میخوام کاری کنم که در مدیریت بشه ، یک فرزند رو تغییر داد و اونو والد کرد . یعنی parent_id اون بشه NULL .
اما این خطا اتفاق می افته :
نقل قول:
Cannot add or update a child row: a foreign key constraint fails (`blog`.`category`, CONSTRAINT `category_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON DELETE SET NULL ON UPDATE CASCADE)
)
آیا ارتباطی به cascade داره یا خیر ؟
فیلد parent_id رو Nullable گذاشتین؟
کد فرمتون رو بگذارین چون احساس میکنم Null نمیشه. دقت کنید که Null رو نباید توی کوتیشن بگذارین توی کوئری. مثال:
UPDATE `category` SET `parent_id`=NULL WHERE (`id`='5');
و این کد اشتباهه:
UPDATE `category` SET `parent_id`='NULL' WHERE (`id`='5');
بله این فیلد رو پیش فرض null گزاشتم که موقع درج اگر والدی انتخاب نشد ، NULL ثبت بشه .
هم مقدار پیش فرض رو NULL گزاشتم و هم nullable
در قسمت ویرایش گفتم اگر کاربر از منو ، گزینه ی " بخش اصلی " رو انتخاب کرد اینو ست کنه :
$data['parent_id']=NULL;
مشکل در کد update ای هست که بصورت PDO نوشتم :
public function update($tabel, $fild = null ,$where = null)
{
$update = 'UPDATE '.$tabel.' SET ';
$set=null; $value=null;
foreach($fild as $key => $values)
{
$set .= ', '.$key. ' = :'.$key;
$value .= ', ":'.$key.'":"'.$values.'"';
}
$update .= substr(trim($set),1);
$json = '{'.substr($value,1).'}';
$param = json_decode($json,true);
if($where != null)
{
$update .= ' WHERE '.$where;
}
$query = parent::prepare($update);
$query->execute($param);
$rowcount = $query->rowCount();
return $rowcount;
}
در قسمت foreach فکر میکنم NULL در رشته قرار میگیره و قبول نمیکنه .
نمیدونم چطور برای مقادیر NULL این کد رو اصلاح کنم . اگر کوتیشن ها رو بردارم برای execute خطا میده .
خوب یه if بگذارین اگه values$ نال بود کوتیشن نگذاره. بعد هم من نفهمیدم چرا JSON رو قاطی ماجرا کردین. این کد رو تست کنید:
public function update($table, $fields = null ,$where = null)
{
$sql = 'UPDATE ' . $table.' SET ';
$updateFields = array();
$params = array();
foreach($fields as $key => $value) {
if(is_null($value)) {
$updateFields[] = '`' . $key . '`=NULL';
}
else {
$updateFields[] = '`' . $key . '`=:' . $key;
$params[':' . $key] = $value;
}
}
$sql .= implode(', ', $updateFields);
if(!is_null($where)) {
$sql .= ' WHERE ' . $where;
}
$query = parent::prepare($sql);
$query->execute($params);
return $query->rowCount();
}