php
  • mysql
  • pdo
  • 2016-08-26 2 views 1 likes 
    1

    다음과 같은 데이터베이스 쿼리에서 준비된 PDO 문을 사용하려고합니다. 여기서 자리 표시 자 변수는 따옴표로 묶인 숫자로 표시됩니다 (예 : "123 "와"456 : 123 "과"456 "변수 (정규식 표현에 그게 가능하다"쿼리에 REGEX가있는 준비된 SQL 문에 대한 보안

    SELECT `user_ID` as `ID` 
    FROM `usermeta` 
    WHERE (`meta_key` = 'custom_fields') 
    AND (`meta_value` REGEXP '.*"ABC";.*s:[0-9]+:"123".*') 
    AND (`meta_value` REGEXP '.*"DEF";.*s:[0-9]+:"456".*') 
    

    내 질문은 가장 좋은 방법은 전체 정규식 표현에 결합, 아니면 그냥하는 것입니다 "), 아니면 완전히 다른 것? 선호 즉,

    이 :

    SELECT `user_ID` as `ID` 
    FROM `usermeta` 
    WHERE (`meta_key` = 'custom_fields') 
    AND (`meta_value` :REGEXP1) 
    AND (`meta_value` :REGEXP2) 
    
    $stmt->bindParam(':REGEXP1', "REGEXP '.*"ABC";.*s:[0-9]+:"123".*'"); 
    $stmt->bindParam(':REGEXP2', "REGEXP '.*"DEF";.*s:[0-9]+:"456".*'"); 
    

    또는이? (자리 표시자를 둘러싼 큰 따옴표에 몇 가지 문제가 있음을 알고 있습니다.)

    SELECT `user_ID` as `ID` 
    FROM `usermeta` 
    WHERE (`meta_key` = 'custom_fields') 
    AND (`meta_value` REGEXP '.*"ABC";.*s:[0-9]+:":value1".*') 
    AND (`meta_value` REGEXP '.*"DEF";.*s:[0-9]+:":value2".*') 
    
    $stmt->bindParam(':value1', '123'); 
    $stmt->bindParam(':value2', '456'); 
    

    감사합니다.

    답변

    1

    자리 표시자는 인용 할 수 없습니다. 그와 같이 단순 :

    SELECT ... WHERE foo = ? 
    SELECT ... WHERE foo = '?' 
    

    첫 번째 것은 자리 표시 자이며 예상대로 작동합니다. 다른 하나는 문자 "물음표"에 대한 동등성을 테스트하는 것입니다. 더 이상 자리 표시자가 아닙니다.

    그리고 ?은 정규식 메타 문자이기도합니다. 자리가 인용 될 수 있다면, 그 쿼리 자리가 될 ?

    SELECT ... WHERE foo REGEXP '^.?' 
    

    주어, 또는 정규식 "제로 또는-하나"범위 연산자입니까?

    당신이 정규 표현식에에서 자리 표시자를 사용하려면 정규식 패턴

    SELECT ... WHERE foo REGEXP concat('^.', ?) 
    

    "를 구축"할 필요가 정확히 당신이 LIKE 패턴을 구축해야 할 것이다과 같은 방식 :

    SELECT ... WHERE foo LIKE '%?%' // wrong 
    SELECT ... WHERE foo LIKE concat('%', ?, '%') // right 
    
    +0

    브릴리언트을 . 고맙습니다. – user1596165

    관련 문제