Имам странен проблем с preg_match

MaLa_NocHe

Registered
Здравейте колеги, имам доста странен проблем с един код който преди време съм го използвал и знам че работи, но нещо му има явно.. та ето го кода:

PHP:
$getID = $_GET['id'];
			$slq = mysql_query("SELECT * FROM mp3cat_song WHERE id='$getID'") or die (mysql_error());
			$row = mysql_fetch_assoc($slq);
$result22 = mysql_query("SELECT * FROM mp3cat_catsmusic") or die (mysql_error());
			echo '<table><tr></tr>';
			while($roww=mysql_fetch_array($result22))
		{
		$id = $roww['id'];
		$kategorianame = $roww['kategoria'];
		$poleto = (preg_match("#,$roww[id],#", $row['kategoria'])) ? "checked" : "";


Проблема е че не маркирва чекед на чекбоксовете които са избрани от полето в базата данни на песните.
 
Този регулярен израз ще отчете само стойност, която е между 2 други стойности. Трябва да провериш за първа, последна и единствена стойност. Според мен по-лесно ще бъде така:
$getID = $_GET['id'];
$slq = mysql_query("SELECT * FROM mp3cat_song WHERE id='$getID'") or die (mysql_error());
$row = mysql_fetch_assoc($slq);
$kategorii = explode(",",$row['kategoria']);
$result22 = mysql_query("SELECT * FROM mp3cat_catsmusic") or die (mysql_error());
echo '<table><tr></tr>';
while($roww=mysql_fetch_array($result22))
{
$id = $roww['id'];
$kategorianame = $roww['kategoria'];
$poleto = (in_array($roww[id], $kategorii)) ? "checked" : "";
Иначе с регулярен израз ще бъде нещо такова: "/^".$roww[id]."$|^".$roww[id].",|,".$roww[id]."$|,".$roww[id].",/"
 
Хмм.. не мислите ли, че усложнявате нещата малко?

това:
Код:
		$poleto = (preg_match("#,$roww[id],#", $row['kategoria'])) ? "checked" : "";
става така:

PHP:
$poleto = strpos($row['kategoria'], $roww['id']) ? 'checked' : '';
Няма нужда от никакви масиви, explode-та, regexp и т.н.
Само един strpos.
 
@anonimen:
Представи си ситуация, в която имаш категории 1,2,3, ... ,9,10,11,12,13
При търсене за 1 ще даде съвпадение на 1,10,11,12,13, така че трябва да има разделител и всеки елемент да се разглежда по отделно. Иначе относно усложняването - цялата идея да се записват множество стойности в 1 поле противоречи на теорията на релационните БД. Правилния начин за създаване на релация много към много е да се направи допълнителна таблица, която да свързва всеки запис със съответстващите му категории.
 
raiden каза:
Този регулярен израз ще отчете само стойност, която е между 2 други стойности. Трябва да провериш за първа, последна и единствена стойност. Според мен по-лесно ще бъде така:
$getID = $_GET['id'];
$slq = mysql_query("SELECT * FROM mp3cat_song WHERE id='$getID'") or die (mysql_error());
$row = mysql_fetch_assoc($slq);
$kategorii = explode(",",$row['kategoria']);
$result22 = mysql_query("SELECT * FROM mp3cat_catsmusic") or die (mysql_error());
echo '<table><tr></tr>';
while($roww=mysql_fetch_array($result22))
{
$id = $roww['id'];
$kategorianame = $roww['kategoria'];
$poleto = (in_array($roww[id], $kategorii)) ? "checked" : "";
Иначе с регулярен израз ще бъде нещо такова: "/^".$roww[id]."$|^".$roww[id].",|,".$roww[id]."$|,".$roww[id].",/"


Колега много благодаря, твоето решение помогна за проблема :)
 
В израза представяш $roww[id] като стринг, а не като стойност. И между другото - кода ти е образец за инжекции :)
 

Горе