2010-03-23 1 views
0

Это странно. На странице сведений о новостях я хочу взять несколько разных значений из разных таблиц с одним запросом. Однако по какой-то странной причине я возвращаю только два значения. Таким образом, результат выглядит следующим образом:Почему не могу использовать более двух значений из трех разных таблиц в одном запросе

<Desc></Desc> 
<Date/> 
</row> 
</rows> 

Если я отключу полное имя, тогда я получаю shortdesc, но не другие. То же самое происходит с другими.

NewsID = Request.QueryString("NEWSID") 

SQL = "SELECT N.NewsID, N.MembersID, N.CategoriesID, N.ImagesID, N.NewsTitle, N.NewsShortDesc, N.NewsDesc, N.NewsActive, N.NewsDateEntered, C.CategoriesID, C.CategoriesName, M.MembersID, M.MembersFullName" 

Set objViewNews = objConn.Execute(SQL) 

With Response 
    .Write "<?xml version='1.0' encoding='windows-1254' ?>" 
    .Write "<rows>" 
End With 

With Response 
    .Write "<row id='"& objViewNews("NewsID") &"'>" 
    .Write "<FullName>"& objViewNews("MembersFullName") &"</FullName>" 
    .Write "<CategoryName>"& objViewNews("CategoriesName") &"</CategoryName>" 
    .Write "</row>" 
End With 

With Response 
    .Write "</rows>" 
End With  

objViewNews.Close 
Set objViewNews = Nothing 
+2

Еще одна уязвимость в SQL-инъекции ... это третий за одну ночь, я начинаю чувствовать себя подавленным. – Aaronaught

+0

@ Мы не должны начинать реестр, поэтому мы знаем, какие проекты не будут приняты в будущем. –

ответ

0
  1. Я предполагаю, что вы ожидаете одну строку или только заботиться о первом ряду?
  2. Является ли MemberFullName нулевым? Является ли значение NewsShortDesc допустимым?
  3. Вы всегда должны проверять свои входы, а не конкатенировать их непосредственно в строку. Таким образом, вы должны использовать функцию, которая проверяет и проверяет, что NewSID имеет типа вы ожидаете и правильно сбежавшую так:
SQL = SQL & " Where N.NewsId = " & SqlString("int", newsId)

4.You может рассмотреть вопрос об использовании JOIN синтаксис как так:

(Предположив функция входа проверки)

SQL = "SELECT N.NewsID, N.MembersID, N.CategoriesID, N.ImagesID, N.NewsTitle, N.NewsShortDesc, N.NewsDesc, N.NewsActive, N.NewsDateEntered, C.CategoriesID, C.CategoriesName, M.MembersID, M.MembersFullName" 
    SQL = SQL & " FROM News N" 
    SQL = SQL & " Inner Join Categories C" 
    SQL = SQL & "  On C.CategoriesID = N.CategoriesID" 
    SQL = SQL & " Inner Join Members M" 
    SQL = SQL & "  On M.MembersID = N.MembersID" 
    SQL = SQL & " Where N.NewsId = " & SqlString(VariantType.Integer 
, NewsId) 
    SQL = SQL & " And N.NewsActive = 1" 

(человеку форматирование может быть изворотливым)

EDIT Вы должны попробовать оборачивать все значения в CDATA так:

With Response 
    .Write "<row id='"& objViewNews("NewsID") &"'>" 
    .Write "<FullName><![CDATA["& objViewNews("MembersFullName") &"]]></FullName>" 
    .Write "<CategoryName><![CDATA["& objViewNews("CategoriesName") &"]]></CategoryName>" 
    .Write "<Title><![CDATA["& objViewNews("NewsTitle") &"]]></Title>" 
    .Write "<ShortDesc><![CDATA["& objViewNews("NewsShortDesc") &"]]></ShortDesc>" 
    .Write "<Desc><![CDATA["& objViewNews("NewsDesc") &"]]></Desc>" 
    .Write "<Date>"& objViewNews("NewsDateEntered") &"</Date>" 
    .Write "</row>" 
End With 

Я не завернуть значение даты в CDATA, хотя вы могли бы также рассмотреть возможность сделать это просто, чтобы быть уверенным.

+0

, хотя все поля имеют значение NULL, ни один из полей не пуст. – zurna

+0

также я уверен, что NewsID является целым числом, поэтому я не думаю, что мне нужно проверить его с помощью функции. Я просто использовал коды, которые вы написали, тот же результат ?? – zurna

+1

Там одна и только одна строка получается из запроса, и если вы Response.Write все значения напрямую, он выводит что-то для каждого значения? Вы всегда должны проверять значения, которые входят в любой запрос, даже если вы считаете, что знаете, что это будет целое число, чтобы защитить от SQL Injection (или даже сообщить людям, что вы защищаете от SQL Injection). – Thomas

Смежные вопросы