Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Передача нескольких параметров в TSQL-запрос
Форумы портала PHP.SU » » Работа с СУБД » Передача нескольких параметров в TSQL-запрос

Страниц (1): [1]
 

1. komiller - 06 Сентября, 2011 - 19:26:04 - перейти к сообщению
Здравствуйте уважаемые.

Уже несколько дней бьюсь головой об стенку не помогает Не понял , проблема заключается в том что пишу типа отчетную страничку и надо бы в TSQL - запросе передать несколько параметров и иногда некоторые параметры могу отсутствовать, как сделать так чтобы при запросе данных и отсутствии одного из параметров запроса заменить значением по умолчанию?

Например запрос:

SELECT Name, FName, WorkPlace FROM Users WHERE Name=".$User." AND FName=".FName."

и скажем попадется пользователь у которого нет фамилии а у меня в запросе стоит параметр FName=".FName." и соответственно выдаст мне ошибку,

Заранее благодарен за помощь.
С уважением.
2. Мелкий - 06 Сентября, 2011 - 20:29:00 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $where = array();
  2. if (проверяете поочерёдно ваши возможные фильтры) $where[] = '`имя столбца`="'.$значение.'"';
  3. $sql = "SELECT Name, FName, WorkPlace FROM Users";
  4. if ( ! empty($where)) $sql .=" where ".join(' and ',$where);
3. komiller - 07 Сентября, 2011 - 06:54:26 - перейти к сообщению
Мелкий пишет:
PHP:
скопировать код в буфер обмена
  1. $where = array();
  2. if (проверяете поочерёдно ваши возможные фильтры) $where[] = '`имя столбца`="'.$значение.'"';
  3. $sql = "SELECT Name, FName, WorkPlace FROM Users";
  4. if ( ! empty($where)) $sql .=" where ".join(' and ',$where);


Спасибо огромное за ответ, узнал про empty и isset.

Но у меня проблема немного иного характера, например есть два параметра после WHERE Name=".$Name." AND FName=".$FName." если пользователь зашел на старичку и нажал кнопку ОТЧЕТ то запрос должен быть типа WHERE Name=".$Name." а если выбрал пункт FName из ComboBox то запрос будет типа WHERE Name=".$Name." AND FName=".$FName."

Спасибо за ответ
4. Мелкий - 07 Сентября, 2011 - 09:48:05 - перейти к сообщению
Нет, я вас понял верно. По крайней мере второй раз - одинаково.

У вас может быть много if (/**/) $where[] = '`имя столбца`="'.$значение.'"'; потому и используется массив.
5. komiller - 07 Сентября, 2011 - 10:40:53 - перейти к сообщению
Мелкий пишет:
Нет, я вас понял верно. По крайней мере второй раз - одинаково.

У вас может быть много if (/**/) $where[] = '`имя столбца`="'.$значение.'"'; потому и используется массив.


Прошу прошения за назойливость ) но тут возникла другая задача, пользователь заходит и просто нажимает кнопку ОТЧЕТ и формируется запрос такого рода:

SELECT Name, FName FROM Users WHERE Name=".$user."

Но если пользователь выберет из списка

<?
$tsql = "select lname, fname, companyname from users where parentid = '$users'";
$stmt = sqlsrv_query($conn, $tsql) or die(DisplayErrors());
while($row = sqlsrv_fetch_array($stmt)){
if($row['iscompany']==1){$lname = $row['companyname'];} else {$lname = $row['lname']." ".$row['fname'];}
?>
<option value="<?echo $row['userid'];?>" style="padding-left: 5px;" <? if($agent == $row['userid']){echo "selected";}?>><?echo iconv('cp1251', 'utf-8', $lname);?></option>
<?
}
?>

То в таком случаи надо передать значение lname выбранного пользователя.
6. Мелкий - 07 Сентября, 2011 - 11:02:28 - перейти к сообщению
option есть, значит выше - есть select. У select'а есть имя и оно передаётся крипту при отправке формы.
Вот и смотрите в обработчике - пришёл селект с формы, и если да, и не является служебным пунктом типа "выбери меня, выбери меня!", то вставляете условие в запрос..
7. komiller - 07 Сентября, 2011 - 12:22:08 - перейти к сообщению
Мелкий пишет:
option есть, значит выше - есть select. У select'а есть имя и оно передаётся крипту при отправке формы.
Вот и смотрите в обработчике - пришёл селект с формы, и если да, и не является служебным пунктом типа "выбери меня, выбери меня!", то вставляете условие в запрос..


В запрос поставить параметр не проблема, только иногда пользователь может не выбрать этот пунк и запросить просто с WHERE UserId=".$user."
8. Мелкий - 07 Сентября, 2011 - 13:12:55 - перейти к сообщению
Так о том и речь, ставить не только значение параметра, а весь кусок сравнения.
Например, чуть менее аккуратно по коду, но, наверное, более наглядно:
PHP:
скопировать код в буфер обмена
  1. $sql = "SELECT Name, FName FROM Users WHERE Name=".$user." ";
  2. /**
  3.  * предположим, что селект называется lname, передаётся постом, в value - только цифры по-умолчанию выбран элемент с value="0"
  4.  */
  5. if (isset($_POST['lname']) && is_numeric($_POST['lname']) && $_POST['lname'] > 0) {
  6. $sql .= " and `lname`=".intval($_POST['lname']);
  7. }
  8. //выполнение запроса.
9. komiller - 07 Сентября, 2011 - 14:02:45 - перейти к сообщению
Значениев КомбоБокс-е выбирается из вот этого:

CODE (htmlphp):
скопировать код в буфер обмена
  1. <?
  2. $tsql = "select agentid, iscompany, lname, fname, companyname from agents where parentid = '$agentid'";
  3. $stmt = sqlsrv_query($conn, $tsql) or die(DisplayErrors());
  4. while($row = sqlsrv_fetch_array($stmt)){
  5. if($row['iscompany']==1){$agentname = $row['companyname'];} else {$agentname = $row['lname']." ".$row['fname'];}
  6. ?>
  7.                                                                         <option value="<?echo $row['agentid'];?>" style="padding-left: 5px;" <? if($agent == $row['agentid']){echo "selected";}?>><?echo iconv('cp1251', 'utf-8', $agentname);?></option>                                              
  8. <?
  9. }
  10. ?>


Сам запрос для вывода данных таков:

PHP:
скопировать код в буфер обмена
  1. <?
  2. $ct_ok = 0;
  3. $ct_cancelled = 0;
  4. $ct_error = 0;
  5. $ct_processing = 0;
  6. $ct_all = 0;
  7. $total = 0;
  8. $d1 = explode(" ", $date1);
  9. $d11 = explode(".", $d1[0]);
  10. $date1 = $d11[2]."-".$d11[1]."-".$d11[0]." ".$d1[1];
  11. $d2 = explode(" ", $date2);
  12. $d22 = explode(".", $d2[0]);
  13. $date2 = $d22[2]."-".$d22[1]."-".$d22[0]." ".$d2[1];
  14. $tsql = "SELECT  CONVERT(char(10), receipts.DateCreated, 103) + ' ' + CONVERT(char(10), receipts.DateCreated, 108) as DateCreated,
  15. agents.LName, agents.FName, payment_types.pname, receipts.SourceId, receipts.TargetId, receipts.Amount,receipts.Comment,
  16. users.LName as UserLName, users.FName as UserFName, users.AgentId as Agent
  17. FROM receipts
  18. INNER JOIN agents ON receipts.SourceId=agents.AgentId
  19. INNER JOIN payment_types ON receipts.PType=payment_types.ptype
  20. INNER JOIN users ON users.AgentId=receipts.TargetId AND users.Role='1'
  21. WHERE receipts.SourceId=".$agent."
  22. AND receipts.DateCreated BETWEEN CAST('".$date1.".000' AS DATETIME) AND CAST('".$date2.".999' AS DATETIME)
  23. ORDER BY receipts.DateCreated";
  24. //echo $tsql;
  25. $stmt = sqlsrv_query($conn, $tsql);
  26. //if($stmt){
  27. $amount=0;
  28. while($row = sqlsrv_fetch_array($stmt))
  29. {
  30. if($row['IsCompany']==1){$agentname = $row['CompanyName'];} else {$agentname = $row['LName']." ".$row['FName'];;}
  31. $amount+=$row['Amount'];
  32. $target = $row['UserLName']." ".$row['UserFName'];
  33. ?>
  34.                                                                 <tr>
  35.                                                                         <td class="td_date"><?echo str_replace('/', '.', $row['DateCreated']);?></td>
  36.                                     <td class="td_oper"><?echo iconv('cp1251', 'utf-8', $agentname);?></td>
  37.                                                                         <td class="td_tran"><?echo iconv('cp1251', 'utf-8', $row['pname']);?></td>
  38.                                     <td class="td_oper"><?echo iconv('cp1251', 'utf-8', $target);?></td>
  39.                                     <td class="td_tran"><?echo number_format($row['Amount'], 2, '.', '');?></td>
  40.                                     <td class="td_tran"><?echo iconv('cp1251', 'utf-8', $row['Comment']);?></td>
  41.                                                                 </tr>
  42.                              
  43. <?
  44. $ct_all++;
  45. }
  46. ?>
  47.  

Когда просто нажимаю кнопку ОТЧЕТ показывает но мне еще нужно чтобы если выбрать параметр из комбобокс тоже показывало но уже с измененным параметром receipts.SourceId=".$agent."
10. Мелкий - 07 Сентября, 2011 - 14:20:42 - перейти к сообщению
komiller пишет:
Значениев КомбоБокс-е выбирается из вот этого:

В option комбо-боксов быть не может, или я совершенно ничего не понимаю в вебе. Это должно идти описание select'а.

А что происходит вашем коде я вообще не понимаю. Какие-то странные манипуляции над неизвестно откуда взявшимися данными. И, чувствуется мне, идти надо туда: http://php.su/phphttp/forms/
11. komiller - 07 Сентября, 2011 - 14:39:36 - перейти к сообщению
[quote=Мелкий]
komiller пишет:
Значениев КомбоБокс-е выбирается из вот этого:

В option комбо-боксов быть не может, или я совершенно ничего не понимаю в вебе. Это должно идти описание select'а.
12. Мелкий - 07 Сентября, 2011 - 15:15:31 - перейти к сообщению
komiller, а вы не робот, случаем?

Ещё раз повторю - смотрите, пришло ли значение с формы. Если пришло - учитывайте его значение/условие в запросе, иначе - другое значение/условие.
13. komiller - 07 Сентября, 2011 - 15:18:42 - перейти к сообщению
Улыбка нее точно не робот

вот проблема в том что условие не могу задавать, так как до вчерашнего дня писал на ASP.Net )) по этому прошу помочь в написании условия

 

Powered by ExBB FM 1.0 RC1