의문문에서 삐침표를 사용하는 것은 곤란하다

7404 단어 quickbooks-ruby

묘사

나는 이름에 삐침표가 있는 고객을 검색하려고 시도하고 있다.조회 자원 관리자가 생성한 조회는
회사 이름이%3D'mcgee%5C's인 고객 중 선택*
정확한 데이터를 되돌려줍니다.gem에서 다음 검색어를 생성하였으나, 이 검색어는 실패했습니다
선택 + * + from + customer + where + companyname +% 3D% 27 mcgee% 255C% 27s% 27
질의 생성기는 URI를 사용합니다.encode ww form 어셈블리에서 올바른 인코딩 문자열을 생성하지만 삐침표는 무시해야 한다고 생각합니다.

토론 #1

이것은 내가 여기에서 언급한 OAuth 요청의 인코딩과 관련이 있을 수 있다http://minimul.com/escaping-an-ampersand-within-an-oauth-request.html
나는 내가 Quickeebooks gem에서 이 문제를 처리한 적이 있다고 생각하지만, 나는 반드시 연구를 해야 한다.이상적인 상황에서, 우리는 여전히 삐침표로 검색하기를 희망한다.

토론 #2

재미있어요.내 QBO 테스트에서 나는 회사 이름이 삐침표로 끝나는 고객(Mark O'Halloran)을 만들었다.
API Explorer에서는 다음 구문만 사용하여 고객을 질의할 수 있습니다.
select * from customer where companyname LIKE '%O\'Halloran'
나는 반드시 수동으로 전의 반사봉을 삽입해야 한다.그 밖에 나는 어쩔 수 없이 단인용 부호로 이 자구를 묶어야 한다. 이인용 부호를 사용하는 것은 통하지 않는다.
API Explorer에 따라 내 질의 문자열을 다음과 같이 변환합니다.
https://qb.sbfinance.intuit.com/v3/company/123/query?query=select * from customer where companyname LIKE '%25O%5C'Halloran'
이 자구 주위의 따옴표가 그것들 자체가 아니라 어떻게 여전히 존재하는지 주의하십시오.
그래서 몇 가지 일을 해야 할 것 같다.
1) 자구가 큰 따옴표로 묶여 있는지 확인
2) 이스케이프되지 않도록 특정 방법으로 따옴표 보호
3) 확실하지는 않지만 서브문장의 내부 문자(예: Foo-bar를 변경할 수 있으며, 이스케이프-가 필요할 수 있습니다.확실하지는 않습니다.
이 라이브러리의 사용자가 미세한 차이를 걱정하지 않도록 하기 위해서, 이것은 거의 두 가지를 의미한다.
1) 특정 쿼리 생성기 제공
2) 쿼리 생성기는 CGI/URI 이스케이프만 내부 값에 적용하므로 패키지 따옴표를 유지할 수 있습니다.
즉흥 구현:
query = QueryBuilder.new
query.add_clause("CompanyName", "LIKE", "%O'Halloran")

query.to_s
=> "CompanyName LIKE '%25O%27Halloran'"
그 중에서 to_s의 실현 방식은 다음과 같다.

def to_s
  encoded = []
  clauses.each do |field, operator, value|
    escaped = URI.encode_www_form_component(value)
    encoded << "#{field} #{operator} '#{escaped}'"
  end

  encoded.join(" AND ")
end
가장 큰 문제는 AND/OR 자구 등을 지원하는 완전한 조회 생성기를 구축해야 하거나, 사용자가 자체적으로 자구를 구축하는 전의 메커니즘만 제공해야 한다는 것이다.
def clause(field, operator, value)
  escaped = URI.encode_www_form_component(value)
  "#{field} #{operator} '#{escaped}'"
end
그리고 이렇게 사용한다.

query = "SELECT * From Customer WHERE "
query << QueryBuilder.clause("CompanyName", "LIKE", "%O'Halloran")
query << " OR "
query << QueryBuilder.clause("CompanyName", "=", "Smith")
사상

토론 #셋

만약 그들이 표준 SQL 문법을 따른다면, 인용부호는 실행할 때 문자열을 끊어야 하는 유일한 것이다.표준 질의를 처리하는 방법 중 하나는 문자열을 인코딩한 후%25를 단일 따옴표로 변환하는 것입니다.이렇게 하면%5C가 유지되고 QB에서 올바르게 해석될 수 있습니다.문서에 문자열을 표시하려면 인용부호로 묶어야 하고, 검색 매개 변수는 뜻을 바꿔야 한다.

토론 #4

그들의 SQL 사투리가 얼마나 표준적인지 말할 수 없다. 나는 그들이 먼저 그것을 해석한 다음에 자신의 조회를 구축한다고 생각한다.나는 그들이 지금처럼 SQL에 문자열을 넣을 것이라고 의심한다.

One way to handle the standard queries is to convert the %25 back to a single quote after encoding the string.


그러나 어떤 따옴표는 확실히 존재해야 한다. 그러면 우리는 어떤 것을 보류하고 어떤 것을 되돌려야 하는지 어떻게 알 수 있을까?나는 네가 한 말을 알아듣지 못했다고 생각한다.

토론 #5

내 말은 우리가 모든 인용부호를 보존하고 어떠한 인용부호도 인코딩하지 않는다는 것이다.
그들이 구축한 조회는 단인용 부호를 그대로 유지하고 다른 모든 단인용 부호를 인코딩한다
영숫자 문자가 없습니다.인코딩 발생 후 줄, 우리는 마땅히
%25의 작은 따옴표를 원래 형식으로 변환합니다.사용자가
질의를 작성할 때 이스케이프 따옴표가 필요합니다.
2014년 2월 21일 오전 10:03, "코디 코란"[email protected]쓰기:
응, 알았어. 
응, 나는 도서관 사용자들에게 Intuit의 까다로운 인용 수요를 의식하도록 요구하는 것은 어려운 임무라고 확실히 생각한다. 
따라서, 나는 필드, 연산자, 값을 받아들이고, 적당한 자구를 구축하는 기본적인QueryBuilder와 같은 클래스에 기본적인 방법을 제공하는 것을 고려하고 있다.이렇게 하면 사용자는 이 w/o를 안심하고 사용할 수 있어 세부 사항을 걱정할 필요가 없다.나의 첫 번째 교체에서, 그것은 WHERE를 위한 전의자구만 구축할 뿐이다. 즉, 나는 완전히 미친 ARel식 조회 생성기나 그 어떤 것도 제공하지 않을 것이다.이번에는 간단하게.
물론 사용자가 이러한 규칙을 알고 수동으로 조회를 생성하기를 원한다면 모든 방법을 다 생각할 수 있다.
나는 내가 언제 이 일을 할 수 있을지 모르겠다. 이번 주에 할 수 있기를 바란다.
보낸 사람: Chris Woolum Chris Woolum
ruckus/quickbooks [email protected]
날짜: 2014년 2월 21일 오전 10:17:46
ruckus/[email protected]
제목: Re:[quickbooks ruby] 쿼리(#54)에서 삐침표 문제 발생
나는 우리가 그것들을 인코딩하지 않고 모든 따옴표를 보존했다고 말한다.
그들이 구축한 조회는 단인용 부호를 그대로 유지하고 다른 모든 단인용 부호를 인코딩한다
영숫자 문자가 없습니다.인코딩 발생 후 줄, 우리는 마땅히
%25의 작은 따옴표를 원래 형식으로 변환합니다.사용자가
질의를 작성할 때 이스케이프 따옴표가 필요합니다.
2014년 2월 21일 오전 10:03, "코디 코란"[email protected]쓰기:

Impossible to say how "standard" their SQL dialect is - methinks they parse it first and build their own query. I doubt they take the string and drop it into SQL as-is.

One way to handle the standard queries is to convert the %25 back to a single quote after encoding the string.

But some single-quotes do need to exist - so how would we know which ones to preserve and which ones to convert back? I dont think I am following what you're saying.

Reply to this email directly or view it on GitHubhttps://github.com/ruckus/quickbooks-ruby/issues/54#issuecomment-35756136 .

토론 #6

이것은 나의 첫 번째 시도이다.
https://github.com/ruckus/quickbooks-ruby#query- 빌드--필터링
기본적으로 따옴표는 백슬래시로 뜻을 바꾸기만 하면 서비스베이스의 정상적인 CGI/URI 뜻을 바꾸면 효력이 발생한다.

토론 #7

항목에 삐침표로 이름을 조회해야 하는 장면을 만났습니다.삐침표는 기본적으로 두 가지 유형(삐침표나 타자기 삐침표)이 있다.우리가 타자기 삐침표를 사용할 때 모든 것이 좋은 것 같지만, 내가 일반 삐침표 (일반 키보드에 존재하지 않음) 를 사용하여 검색할 때, 코드는 다음과 같은 오류로 인해 중단된 것 같다. '무효 내용'.1행 43열에 어휘 오류가 발생했습니다.'\'%Fleur'이후의'\u2019'(8217)를 만났습니다.
이것이 바로 내가 삐침표를 피하는 방법이다.
Working with ' : 

util = Quickbooks::Util::QueryBuilder.new
clause1 = util.clause("NAME", "LIKE", "%Fleur't")
item_services.query("SELECT * FROM ITEM WHERE #{clause1}")

Not Working ’ :

util = Quickbooks::Util::QueryBuilder.new
clause1 = util.clause("NAME", "LIKE", "%Fleur’t")
item_services.query("SELECT * FROM ITEM WHERE #{clause1}")

이런 특수한 배역은 어떤 해결 방법이 있습니까?고마워요 고마워요
apostrophe

토론 #8

재미있어요.나는 무슨 간단한 해결 방법이 있는지 모르겠다.
나는 두루마리 따옴표 대신 직접적인 따옴표를 사용해 보았는데, Intuit가 그것들이 똑같다는 것을 식별할 수 있기를 바랐지만, 조회 과정에서 아무런 결과도 나오지 않았다.
정상처럼 도망가도 소용없어. 나도 너와 같은 실수를 할 거야.

토론 #9

    @vendor_service.find_by(:display_name, vendor.name.gsub("'"){"\\'"}).entries.first

토론 #10

@vanboom 실용류를 사용해 보셨습니까?
util = Quickbooks::Util::QueryBuilder.new
clause1 = util.clause("NAME", "LIKE", "%Fleur't")
item_services.query("SELECT * FROM ITEM WHERE #{clause1}")

토론 #11

Escape 특수 문자를 통해 작업을 수행할 수 있습니다.
displayName=displayName.바꾸기("", "\")//특수 문자 이스케이프
QueryService customerQueryService = 새 QueryService(컨텍스트)
customerQuery Service로 돌아갑니다.여기서 (m=>m.DisplayName==DisplayName)FirstOrDefault()

좋은 웹페이지 즐겨찾기