Отново проблем с масивите..

kulov

Registered
Значи проблема този път е следният, правя си анкета, която да има колкото искаш възможни отговора, това се дефинира отначало(колко да са възможните отговори) след като ги дефинираш примерно 2, излизат полетата за заглавието на анкетата и съответно възможните отговори, сайта е многоезичен(В случая е на 4 езика) и съответно вместо 1 поле да речем за заглавието излизат 4 съответно за всеки език по едно, така и за отговорите

Ето картинка какво представлява в случая



Та така нека си дойдем на проблема, когато се добавят отговорите кода е така структориран, че когато добавя в базата отговорите се добавя само първият отговор от езиците, тоест имам таблица която садържа отговорите примерно poll_answers и полетата са

id | title_bg | title_en | title_fr | title_de

и така когато добавям отговорите, от първата заявка се запълва само първите две полета, тей като целия код е в един голям цикъл и целта е просто да се добави в базата и после просто да се ъпдейтне с една заявка и да се запълнят останалите полета с останалите резултати.. и тук идва проблема нали възможните отговри са 2, когато се изпълни първата заявка, която добавя ид-то и title_bg всичко е ок, но когато се ъзпълни втората, която ъпдейтва за да запълни и другите полета стойностите от двете полета са еднакви, и тези стойности които се запълват винаги са на последният отговор, тоест ако на последният съм написал за полето title_en English 2 то той ще е стойност и на другите полета.. Обяснявам всичко това за да ви е по лесно да разберете кода, защото иначе ще ви е трудно..


Код:
if(isset($_POST['submit']))
{
	$lang=mysql_query("SELECT `short` FROM `languages` ORDER BY `id` ASC") or die(mysql_error());
	while($lang_row=mysql_fetch_assoc($lang))
	{
		$short=$lang_row['short'];
					
		for ($i=1; $i<=$num; $i++)
		{
			$arraya2=array("title_$lang_row[short]_$i");
			foreach ($arraya2 as $array2)
			{
				$post2=$_POST[$array2];
				$table=$array;
				$table=explode("_", $table);
			        $table=$table[0]."_".$table[1];
							
				$ask=mysql_query("SELECT `id` FROM `poll_panel_ask` ORDER BY `id` DESC LIMIT 1") or die(mysql_error());
				$ask_r=mysql_fetch_assoc($ask);
				$ask_id=$ask_r['id'];
							
				$ans=mysql_query("SELECT `id` FROM `poll_panel_answer` WHERE `ask_id` = '$ask_id'") or die(mysql_error());
							
				$ans_n=mysql_num_rows($ans);
						
				if ($ans_n < $num)
				{
					$up3=mysql_query("INSERT INTO `poll_panel_answer` (`id`, `ask_id`, `$table`, `result`) VALUES ('', '$ask_id', '$post2', '')") or die(mysql_error());
				}
				else
				{
					$sel=mysql_query("SELECT `id` FROM `poll_panel_answer` ORDER BY `id` DESC LIMIT $num") or die(mysql_error());
					while($r=mysql_fetch_assoc($sel))
					{
						$up7=mysql_query("UPDATE `poll_panel_answer` SET `$table` = '$post2' WHERE `id` = '$r[id]'") or die(mysql_error());
					}	
				}
			}
		}
	}	
}
 
извинявай прочетох го няколк пъти но не разбрах какъв точно ти е проблема, можеби е късно и ми се спи...

това което разбрах е че имаш таблица
с въпроси:
id | title_bg | title_en | title_fr | title_de

и предполагам подобна таблица с отговори
id, въпрос_ид, отговор_бг, отговор_ен, отговор_фр, отговор_де, брой гласували

имаш форма
<input type="text" name="title_bg" />
<input type="text" name="title_en" />

и отговори
огтовор 1;
<input type="text" name="answer_bg[1]" />
<input type="text" name="answer_en[1]" />

отговор 2:
<input type="text" name="answer_bg[2]" />
<input type="text" name="answer_en[2]" />

записваш в базата въпроса, взимаш последното ИД (т.е. ИД на върпоса )
после въртиш с цикъл отгооврите
foreach ( $_POST['answer_bg'] as $key => $val ) {
$otgororBG = $val;
$otgovorEN = $_POST['answer_en'][$key];

//и вкарваш отговорите в базата...
}


пробвай така, и дано съм разбрал какво имаш в предвид
 
Warning: Invalid argument supplied for foreach() in E:\xampp\htdocs\schoolcms\admin\pages\poll_panel_add.php on line 129

Само това ми връща.. колко го въртях.. а това е точно на реда с цикъла, който ти даде ..
 
а направили си полетата отговори да са масив ?
<input type="text" name="answer_en[2]" />
дай един print_r($_POST) и ми кажи какво ти връща
 
Код:
<?php
$query=mysql_query("SELECT `language`, `short` FROM `languages`") or die(mysql_error());
										while($row=mysql_fetch_assoc($query))
{
	echo "Отговор <b>$row[short]</b>: <input name='answer_$row[short][$i]' type='text' size='25' class='input' value=''/><br /><br />";	
}
?>

Това е кода за полетата с отговор (answer_bg[1] - примерно)

Ето какво пръща print_r($_POST);


Код:
Array ( [title_bg] => Bulgarian title [title_en] => English title [title_fr] => French title [title_de] => German title [title_bg_1] => BG 1 [title_en_1] => EN 1 [title_fr_1] => FR 1 [title_de_1] => DE 1 [title_bg_2] => BG 2 [title_en_2] => EN 2 [title_fr_2] => FR 2 [title_de_2] => DE 2 [submit] => Добави ) 1
Array ( [title_bg] => Bulgarian title [title_en] => English title [title_fr] => French title [title_de] => German title [title_bg_1] => BG 1 [title_en_1] => EN 1 [title_fr_1] => FR 1 [title_de_1] => DE 1 [title_bg_2] => BG 2 [title_en_2] => EN 2 [title_fr_2] => FR 2 [title_de_2] => DE 2 [submit] => Добави ) 1
Array ( [title_bg] => Bulgarian title [title_en] => English title [title_fr] => French title [title_de] => German title [title_bg_1] => BG 1 [title_en_1] => EN 1 [title_fr_1] => FR 1 [title_de_1] => DE 1 [title_bg_2] => BG 2 [title_en_2] => EN 2 [title_fr_2] => FR 2 [title_de_2] => DE 2 [submit] => Добави ) 1
Array ( [title_bg] => Bulgarian title [title_en] => English title [title_fr] => French title [title_de] => German title [title_bg_1] => BG 1 [title_en_1] => EN 1 [title_fr_1] => FR 1 [title_de_1] => DE 1 [title_bg_2] => BG 2 [title_en_2] => EN 2 [title_fr_2] => FR 2 [title_de_2] => DE 2 [submit] => Добави ) 1
 
така като гледам изобщо нямаш пост $_POST['answer'] на какъвто и да е език ?
сигурен ли си че html който генерира php е така както ти казах ?
и бтв не прави такива неща:
name='answer_$row[short][$i]'

нека променливата да не е в стринга написана директно.
'name="answer_' . $row['short'] . '[' . $i . ']"'
 
Добре де, така се оправи, тоест answer_bg, answer_en..... вече излизат при print_r, но файда няма, пак вкарва погрешно информацията

94288ee2f3d4488f.PNG


Така, стойностите на първият ред за title_bg, title_en, title_fr, title_de трябва да са

Bulgarian 1, English 1, French 1, German 1 а на вторият

Bulgarian 2, English 2, French 2, German 2..

Дефакто то добавя стойностите на последният отговор на всички.. ето как е кода в момента


Код:
$arraya2=array("title_$lang_row[short]");
foreach ($arraya2 as $array2)
{					
	$table=$array2;
	$answer=$_POST["answer_$lang_row[short]"];
	foreach ($answer as $key => $val) 
	{ 	
		$otgovor = $answer[$key]; 
		
		$ask=mysql_query("SELECT `id` FROM `poll_panel_ask` ORDER BY `id` DESC LIMIT 1") or die(mysql_error());
		$ask_r=mysql_fetch_assoc($ask);
		$ask_id=$ask_r['id'];
									
		$ans=mysql_query("SELECT `id` FROM `poll_panel_answer` WHERE `ask_id` = '$ask_id'") or die(mysql_error());
									
		$ans_n=mysql_num_rows($ans);
							
							
		if ($ans_n < $num)
		{
			$up3=mysql_query("INSERT INTO `poll_panel_answer` (`id`, `ask_id`, `$table`, `result`) VALUES ('', '$ask_id', '$otgovor', '')") or die(mysql_error());
		}
		else
		{
			$sel=mysql_query("SELECT `id` FROM `poll_panel_answer` ORDER BY `id` DESC LIMIT $num") or die(mysql_error());
			while($r=mysql_fetch_assoc($sel))
			{
				$up7=mysql_query("UPDATE `poll_panel_answer` SET `$table` = '$otgovor' WHERE `id` = '$r[id]'") or die(mysql_error());
			}	
		}
	}
}
 
Все още не съм намерил решение, видях, че нещата се объркав когато цикъла се завърти за 4-ти път, има ли някакав начин да укажа на дадена заявка да се върти точно определено брой пъти, независимо в колко цикъла има и колко пъти ще се завъртят те ?

Ако не сте ме разбрали ще се помъча да го обясня, примерно имаме един цъл for където сме задали да се върти 10 пъти, тоест

for ($i=1; $i<=10; $i++)
{
}

така, в този цикъл има заявка, която трябва да се изпълни и всеки път да се добавя за стойност $i тоест

for ($i=1; $i<=10; $i++)
{
$query=mysql_query("INSERT INTO `table` (`table`) VALUES ('$i')") or die(mysql_error());
}

така, това значи, че ще имам 10 записа със стойности от 1 до 10, въпроса ми е как да направя така, да речем заявката да спира да се променя на 3-тия път, тоест да добави примерно 2 различни записа тоест 1 и 2 и като стигне до 3 от там на татъка тези 7 пъти които остава да не се добавят.. тоест нещо като exit; на самата променлива.. Искам заявката да се изпълни 3 пъти докато се намира в цикъл, който ще се въри 10 пъти..
 

Горе