2014-09-24 17 views
9

Tôi đã tạo một kịch bản lệnh PHP CLI được thiết kế để cho phép tôi chạy các kịch bản cập nhật đối với cơ sở dữ liệu của mình. Kịch bản hoạt động như mong đợi, chạy các tệp cập nhật tuần tự, cuộn lại trên các lỗi, vv Tuy nhiên, điều duy nhất tôi không thể làm cho nó hoạt động đúng là tạo các hàm. Tôi đang thiếu gì?Sự cố khi tạo một hàm MySQL thông qua PDO


Script

Dưới đây là những điều cơ bản về cách kịch bản hoạt động:

$sql = file_get_contents($file); 
$sql = "USE `$database`;" . $sql; 
$stmt = $pdo->prepare($sql); 

try 
{ 
    $stmt->execute(); 

    if($stmt->errorCode() !== '00000') 
    { 
     throw new Exception("Error: Unable to run update $file\n" . print_r($stmt->errorInfo(), true)); 
    } 
} 
catch(Exception $ex) 
{ 
    $pdo->rollBack(); 
    echo "Error: Exception occured running update $file\n" . print_r($ex, true) . "\n"; 
    throw $ex; 
} 

SQL

Và đây là một ví dụ về các phần Chức năng của SQL co de:

DELIMITER ;; 
CREATE DEFINER=CURRENT_USER FUNCTION `uuid_from_bin`(b BINARY(16)) RETURNS char(36) CHARSET latin1 
    DETERMINISTIC 
BEGIN 
    DECLARE hex CHAR(32); 
    SET hex = HEX(b); 
    RETURN LOWER(CONCAT(LEFT(hex, 8), '-', MID(hex, 9,4), '-', MID(hex, 13,4), '-', MID(hex, 17,4), '-', RIGHT(hex, 12))); 
RETURN 1; 
END ;; 

Nếu tôi chạy mã này bên trong MySQL Bàn làm việc chạy như mong đợi. Khi tôi chạy nó thông qua kịch bản của tôi bằng cách sử dụng PDO tất cả mọi thứ ngoại trừ các chức năng được tạo ra và dân cư. Tôi không nhận được lỗi và không có ngoại lệ.


So Far ...

tôi đã cố gắng loại bỏ các DEFINER, nghĩ rằng người dùng đó là "CURRENT_USER" có thể là 'user @ randomip' và người sử dụng trong hệ thống được định nghĩa là 'user @%'.

Tôi cũng vừa xóa số definer khỏi SQL. Vẫn hoạt động trong MySQL Workbench, nhưng không phải trong tập lệnh này.

Tôi cũng đã kéo các hàm ra thành SQL của chính chúng, cùng một kết quả.


Thông tin khác

MySQL 5.5.37-0ubuntu0.14.04.1

PHP 5,5

Khi tôi kết nối với PDO Tôi không thiết lập các DB, kể từ khi script có thể cần tạo cơ sở dữ liệu. Nhưng các tập lệnh được nối với câu lệnh USE. Một lần nữa tất cả các câu lệnh DDL khác hoạt động.

Người sử dụng có tất cả nhưng Grant quyền trên giản đồ dựa trên một mô hình, cụ thể ci_%


Solution, Update DELIMITER

Cập nhật mã để loại bỏ các DELIMITER

#DELIMITER USED TO BE HERE 
CREATE DEFINER=CURRENT_USER FUNCTION `uuid_from_bin`(b BINARY(16)) RETURNS char(36) CHARSET latin1 
    DETERMINISTIC 
BEGIN 
    DECLARE hex CHAR(32); 
    SET hex = HEX(b); 
    RETURN LOWER(CONCAT(LEFT(hex, 8), '-', MID(hex, 9,4), '-', MID(hex, 13,4), '-', MID(hex, 17,4), '-', RIGHT(hex, 12))); 
RETURN 1; 
END; 
+0

Tên của quy trình được lưu trữ là gì? Bạn sẽ thường 'CALL sp_nameOfStoredProc;' –

+0

Bạn đang đăng nhập vào DB nào từ bàn làm việc và từ mã PHP của bạn? Người dùng khác nhau = các bộ quyền khác nhau. –

+0

@JayBlanchard Đây là một tệp có Mã SQL định nghĩa một hàm, không phải là một thủ tục được lưu trữ. Một trong các hàm được liệt kê trong câu hỏi. – Chris

Trả lời

7

Bạn không cần sử dụng DELIMITER khi gửi báo cáo thông qua API như PDO.

Thực tế, bạn không được sử dụng DELIMITER, vì nó không được trình phân tích cú pháp SQL của máy chủ nhận dạng. Nó chỉ được nhận ra trong máy khách mysql.

+0

Tôi thực sự đã thử điều đó trước đó mà không thành công, và tôi đoán là đã tránh xa vấn đề và thử lại lần nữa tôi đã làm một việc khác. Đã cập nhật câu hỏi bằng mã được giải quyết. Cảm ơn. – Chris

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