2011-10-27 28 views
5

giả sử tôi có chức năng thời trang năm 1995 có nghĩa là gửi các truy vấn tới mysql. Tôi có rất nhiều truy vấn về dự án và tôi đang tìm kiếm một hàm/lớp có thể phân tích cú pháp truy vấn thô (giả sử: SELECT foo từ thanh nơi pizza = 'hot' LIMIT 1) và tạo câu lệnh chuẩn bị với php. bạn có lời khuyên nào không? có đáng không? hoặc tốt hơn là chỉ viết lại tất cả các truy vấn?chuyển đổi các truy vấn thô thành câu lệnh chuẩn bị

tôi có thể đếm 424 truy vấn về dự án của tôi, và đó chỉ là lựa chọn

nhờ sự giúp đỡ nào

Trả lời

3

Hãy thử điều này:

function prepare1995Sql_EXAMPLE ($sqlString) { 

    # regex pattern 
    $patterns = array(); 
    $patterns[0] = '/\'.*?\'/'; 

    # best to use question marks for an easy example 
    $replacements = array(); 
    $replacements[0] = '?'; 

    # perform replace 
    $preparedSqlString = preg_replace($patterns, $replacements, $sqlString); 

    # grab parameter values 
    $pregMatchAllReturnValueHolder = preg_match_all($patterns[0], $sqlString, $grabbedParameterValues); 
    $parameterValues = $grabbedParameterValues[0]; 

    # prepare command: 
    echo('$stmt = $pdo->prepare("' . $preparedSqlString . '");'); 
    echo("\n"); 

    # binding of parameters 
    $bindValueCtr = 1; 
    foreach($parameterValues as $key => $value) { 
    echo('$stmt->bindParam(' . $bindValueCtr . ", " . $value . ");"); 
    echo("\n"); 
    $bindValueCtr++; 
    } 

    # if you want to add the execute part, simply: 
    echo('$stmt->execute();'); 
} 

# TEST! 
$sqlString = "SELECT foo FROM bar WHERE name = 'foobar' or nickname = 'fbar'"; 
prepare1995Sql_EXAMPLE ($sqlString); 

Mẫu đầu ra sẽ là:

$stmt = $pdo->prepare("SELECT foo FROM bar WHERE name = ? or nickname = ?"); 
$stmt->bindParam(1, 'foobar'); 
$stmt->bindParam(2, 'fbar'); 
$stmt->execute(); 

này có lẽ sẽ có tác dụng nếu tất cả các câu lệnh SQL của bạn cũng tương tự như ví dụ này, điều kiện là chuỗi. Tuy nhiên, một khi bạn yêu cầu tương đương với số nguyên, mẫu phải được thay đổi. Đây là những gì tôi có thể làm bây giờ .. Tôi biết nó không phải là cách tiếp cận tốt nhất ở tất cả, nhưng vì lợi ích của một mẫu, hãy thử :)

0

Tôi muốn giới thiệu tìm kiếm regexp cho các truy vấn này (tôi nghĩ rằng họ cần phải có mô hình), sau đó phân loại chúng và xem cái nào tương tự/có thể được nhóm lại.

Ngoài ra nếu bạn có một số loại nhật ký, hãy kiểm tra xem nhật ký nào được thực thi thường xuyên nhất, không có ý nghĩa gì khi di chuyển các truy vấn hiếm hoi đến các câu lệnh đã chuẩn bị.

0

Thành thật mà nói, bạn nên viết lại các truy vấn của mình. Sử dụng cụm từ thông dụng sẽ hoạt động, nhưng bạn có thể thấy rằng một số truy vấn không thể được xử lý bởi mẫu. Vấn đề là có rất nhiều phức tạp trong các truy vấn chỉ với một mẫu để phân tích cú pháp tất cả. Ngoài ra, nó sẽ là thực hành tốt nhất và nhất quán cho mã của bạn chỉ đơn giản là làm công việc và viết lại các truy vấn của bạn.

Best of luck!

0

Bạn có thể muốn bật cơ sở theo dõi và nắm bắt các lệnh SQL khi chúng được gửi đến cơ sở dữ liệu. Hãy cảnh giác, rằng những gì bạn sắp thấy sẽ làm bạn sợ hãi khi cởi quần áo :)

Các vấn đề liên quan