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

C++ JAVA
Post Reply
User avatar
MaLa_NocHe
Потребител
Потребител
Posts: 839
Joined: Tue Aug 04, 2009 11:26 am
Answers: 20
Location: Русе

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

Post by MaLa_NocHe » Tue Oct 28, 2014 6:13 pm

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

[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" : "";[/php]


Проблема е че не маркирва чекед на чекбоксовете които са избрани от полето в базата данни на песните.

raiden
Гуру
Гуру
Posts: 2182
Joined: Fri Dec 08, 2006 8:13 am
Answers: 190
Location: Варна

Post by raiden » Wed Oct 29, 2014 10:38 am

Този регулярен израз ще отчете само стойност, която е между 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].",/"

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1607
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 165
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Wed Oct 29, 2014 1:34 pm

Хмм.. не мислите ли, че усложнявате нещата малко?

това:

Code: Select all

		$poleto = &#40;preg_match&#40;"#,$roww&#91;id&#93;,#", $row&#91;'kategoria'&#93;&#41;&#41; ? "checked" &#58; "";
става така:

[php]$poleto = strpos($row['kategoria'], $roww['id']) ? 'checked' : '';[/php]
Няма нужда от никакви масиви, explode-та, regexp и т.н.
Само един strpos.

raiden
Гуру
Гуру
Posts: 2182
Joined: Fri Dec 08, 2006 8:13 am
Answers: 190
Location: Варна

Post by raiden » Wed Oct 29, 2014 3:35 pm

@anonimen:
Представи си ситуация, в която имаш категории 1,2,3, ... ,9,10,11,12,13
При търсене за 1 ще даде съвпадение на 1,10,11,12,13, така че трябва да има разделител и всеки елемент да се разглежда по отделно. Иначе относно усложняването - цялата идея да се записват множество стойности в 1 поле противоречи на теорията на релационните БД. Правилния начин за създаване на релация много към много е да се направи допълнителна таблица, която да свързва всеки запис със съответстващите му категории.

User avatar
MaLa_NocHe
Потребител
Потребител
Posts: 839
Joined: Tue Aug 04, 2009 11:26 am
Answers: 20
Location: Русе

Post by MaLa_NocHe » Wed Oct 29, 2014 3:59 pm

raiden wrote:Този регулярен израз ще отчете само стойност, която е между 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].",/"

Колега много благодаря, твоето решение помогна за проблема :)

lamerko
Турист
Турист
Posts: 267
Joined: Sat Dec 16, 2006 4:14 pm
Answers: 15

Post by lamerko » Fri Oct 31, 2014 3:10 pm

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

Post Reply