запросить две таблицы в одном запросе MySQL - PullRequest
0 голосов
/ 01 августа 2009

У меня проблемы с получением данных из двух отдельных таблиц

пока у меня есть это

<? 
include('config.php'); 
$xid = $_GET['xid'];

$result = mysql_query("SELECT * FROM `config`") or trigger_error(mysql_error()); 
while($row = mysql_fetch_array($result)){ 
foreach($row AS $key => $value) { $row[$key] = stripslashes($value); } 

$result = mysql_query("SELECT * FROM `utinfo` WHERE `xid` = $xid") or trigger_error(mysql_error()); 
while($row2 = mysql_fetch_array($result)){ 
foreach($row2 AS $key => $value) { $row2[$key] = stripslashes($value); } 
$un = urldecode($row2['un']);
};

switch ($row['module'])
{
case 1:
  echo "Function 1 for user $uid on account $un";
  break;
case 2:
  echo "Function 2 for user $uid on account $un";
  break;
case 3:
  echo "Function 3 for user $uid on account $un";
  break;
default:
  echo "No module defined.";

};
};
?>

Конфигурация таблицы конфигурации содержит строку с именем modules, и она заполняется 2 записями, одна из которых 1, а другая 3. Так что я должен видеть случай 1, а затем случай 3. Но все, что я получаю, это эхо по умолчанию .

Ответы [ 4 ]

2 голосов
/ 01 августа 2009

(Это не ответ на ФП, но что-то, что вас действительно должно волновать, поэтому я думаю, что это стоит написать)

Кажется, в вашем коде огромная SQL-инъекция.

Обычный способ вызова вашей страницы - что-то вроде "xid=5" в URL, чтобы получить информацию о пользователе # 5.

Теперь предположим, что кто-то дает "xid=5 or 1=1". Результирующий запрос будет:

SELECT * FROM `utinfo` WHERE `xid` = 5 or 1=1

Условие всегда верно; вы получите информацию о ВСЕХ пользователях в качестве выходных данных при выполнении итерации по набору результатов.

Другая возможность: "xid=5; delete from utinfo;"; который бы дал этот запрос:

SELECT * FROM `utinfo` WHERE `xid` = 5; delete from utinfo;

Это опустошит ваш стол : - (


Вы всегда должны экранировать / проверять / дезинфицировать / все ваши данные, прежде чем помещать их в SQL-запрос, особенно (но не только), если они получены от пользователя приложения.

Для строк см. Функцию mysql_real_escape_string.
Для данных, которые могут быть целыми числами, вы можете использовать intval (в худшем случае, если данные недействительны, вы получите 0, что может не дать результата из БД, но при по крайней мере, не сломаю его ^^)

Другим решением будет использование подготовленных заявлений; но они недоступны с функцией mysql_*: вам нужно переключиться на

В любом случае, для нового приложения не следует использовать mysql_*: оно старое и не получает новых функций / улучшений, которые получают mysqli и PDO ...

0 голосов
/ 01 августа 2009
  1. Почему вы не используете PDO? Вы должны действительно стандартизировать PDO, если можете.
  2. Имена таблиц в SQL select не должны заключаться в кавычки.
  3. Вам следует подумать об использовании подготовленных операторов, чтобы избежать SQL-инъекций, и тогда вам не нужно беспокоиться о необходимости заключать в кавычки свои параметры
0 голосов
/ 01 августа 2009

Первый ответ, вероятно, правильный относительно несоответствий типов, вы должны быть в состоянии решить проблему, используя следующий код:

switch ((integer) $row['module'])

см. Следующее: http://us.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting

В качестве альтернативы, вы можете попробовать это:

settype($row['module'], "integer");

switch ($row['module'])

См: http://us.php.net/manual/en/function.settype.php

Я бы также предложил вывести значение $ row ['module'] на страницу, чтобы убедиться, что оно действительно целое.

0 голосов
/ 01 августа 2009

stripslashes () используется для строк. Ваши значения регистра являются целыми числами. Похоже, у вас здесь несоответствие типов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...