Предавайте стойности, разделени със запетая, чрез php скрипт в sql заявка

Предавам аргумент на моя php код с помощта на уеб браузър в следния формат:

www.site.php?age=1&sex=2

След това в кода за достъп до тези аргументи:

'age' => $_GET['age']
'sex' => $_GET['sex']

Един аргумент трябва да бъде набор от стойности, разделени със запетая (т.е. "1,2,3,4,5"). Когато направя следното, само първата стойност се интерпретира:

www.site.php?age=1&sex=2&nums=1,2,3,4,5

Опитах със скоби, скоби и т.н., които всички нарушават кода. някакви мисли? Благодаря,

РЕДАКТИРАНЕ: Неправилно предположих кога е възникнала грешката. Грешката възниква при опит за действително извикване на sql:

Това работи:

$sql = <<<SQL
    SELECT * from db
    WHERE age=:age AND nums in (1,2)
SQL;
$query = $dbs['base']['connection']->prepare($sql);

$query->execute(array(
    ':age'      => $_GET['age'],

));

Но не успява, когато предам числата:

$sql = <<<SQL
    SELECT * from db
    WHERE age=:age AND nums in (:nums)
SQL;
$query->execute(array(
        ':age'      => $_GET['age'],
            ':nums'  => $_GET['nums']
    ));

Когато просто отпечатам $_GET['nums'], стойностите, разделени със запетая, идват добре. Как мога правилно да предам аргумента „nums“ на sql заявката?


person mike    schedule 26.01.2013    source източник
comment
Каква е стойността на $_GET['nums']? Просто го вземете от този елемент и използвайте explode?   -  person slugonamission    schedule 26.01.2013
comment
Използвам го в sql заявка, казваща WHERE num IN (1,2,3,4,6)   -  person mike    schedule 26.01.2013
comment
Но каква стойност всъщност получавате от променливата $_GET?   -  person slugonamission    schedule 26.01.2013
comment
Стойността, която се опитвам да получа, е 1,2,3,4,6, включително запетаите   -  person mike    schedule 26.01.2013
comment
след това просто използвайте explode, за да го разделите. Предаването му направо към DB е лоша практика, без първо да го избягвате.   -  person slugonamission    schedule 26.01.2013
comment
Проблемът е, че само първата стойност идва, когато предавам стойностите, разделени със запетая, в уеб браузъра.   -  person mike    schedule 26.01.2013
comment
Не може да е прав. Използвайте print_r($_GET); или $_SERVER за отстраняване на грешки. Вероятно вашата заявка за база данни, която е построена грешно.   -  person mario    schedule 26.01.2013
comment
Да, разбрах това точно преди да прочета това - как мога правилно да премина в sql заявката?   -  person mike    schedule 26.01.2013
comment
вижте PDO и SQL IN оператори   -  person peterm    schedule 26.01.2013


Отговори (5)


Опитахте ли urlencode?

// set
$nums = urlencode(join(',', array(1,2,3,4,5)));

// get
$nums = explode(',', urldecode($_GET['nums']));
// i think needs sanitize
$nums = array_map('intval', $nums);
person K-Gun    schedule 26.01.2013
comment
Екранът просто отпечатва масив, когато опитам това: $nums = explode(',', urldecode($_GET['nums'])); печат ($ числа); какво ми липсва - person mike; 26.01.2013
comment
Но когато просто направя $nums = urldecode($_GET['causes']), получавам 1,2,3,4,5 - person mike; 26.01.2013
comment
Да, но трябва да филтрирате $nums за сигурност. След филтър можете да използвате join(), за да получите 1,2,3. - person K-Gun; 27.01.2013

URL кодиране на запетаите, ако искате низ?

www.site.php?age=1&sex=2&nums=1%2C2%2C3%2C4%2C5

Освен това HTTP има формат на масив за параметри, които PHP може да интерпретира автоматично за вас. Забравям синтаксиса внезапно, но е доста ясен.

Редактиране 2: Няма значение, искате низа.

person Tim    schedule 26.01.2013

Не е ясно защо тест като този не работи за вас. Обърнете внимание, че <pre> и print_r() са там само за отстраняване на грешки. explode(',', $_GET['nums']) е ключът.

echo '<pre>';
$nums_array = explode(',', $_GET['nums']);
print_r($nums_array);
echo '</pre>';

Може би трябва да споделите част от кода за анализиране с нас, за да разберем по-добре?

person Giacomo1968    schedule 26.01.2013

Преобразувайте запетаите в нещо по-приятелско на страницата за изпращане

$nums = "1,2,3,4,5";
$nums = str_replace(',','|',$nums);

На страницата, получаваща GET, направете следното:

$nums = str_replace('|',',',$nums);
person Jason Small    schedule 26.01.2013

С текущия интерфейс на базата данни не можете. Той използва подготвени отчети. Вашият списък ще бъде преобразуван в низ, като по този начин вече няма да бъде списък със стойности към клаузата IN.

Ето защо аз например използвам нещо подобно:

db("SELECT * from t1 WHERE id=? AND x IN (??)", $id, $array);

Ще трябва обаче ръчно да създадете някои ?,?,?,?,? контейнери 1, в зависимост от дължината на входния списък (след споменатото разрушаване или по-добро разделяне на str_getcsv). И да, имате нужда от изброени параметри, а не от :named.

1 Точно защото е скучно/досадно, не предоставям примерен код тук.

person mario    schedule 26.01.2013