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;
Tên của quy trình được lưu trữ là gì? Bạn sẽ thường 'CALL sp_nameOfStoredProc;' –
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. –
@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