我怎样才能在phpmyadmin中修复这个sp?

时间:2011-11-01 00:10:01

标签: php mysql pdo phpmyadmin mysql-error-1064

我正在尝试在phpmyadmin中编写一个商店程序,但是我得到了这个错误,我也在navicat中做了但是我得到了同样的错误,有人可以帮我解决吗?,帮助真的很感谢谢谢

#1064 - 您的SQL语法出错;查看与您的MySQL服务器版本对应的手册,以便在'IN comienzo int,IN termino int'附近使用正确的语法。在第2行开始选择usuario.nombre,LEF'

这是我的商店程序:

    CREATE PROCEDURE store(
  IN actualUser varchar(20)
)

SET @comienzo2 = comienzo;
SET @termino2 = termino;
SET @actualUser2 = actualUser;

BEGIN
SELECT
usuario.nombre,
LEFT(titulo, 20) as titulo,
LEFT(mensaje, 20) as mensaje,
correo.fecha,
correo.id_correo,
correo_has_usuario.correo_id_correo,
correo_has_usuario.destinatario_id_usuario,
correo_has_usuario.eliminado,
correo_has_usuario.leido
FROM
correo_has_usuario 
Inner Join correo ON correo_has_usuario.correo_id_correo = 
correo.id_correo
Inner Join usuario ON usuario.id_usuario = 
correo.usuario_id_usuario
WHERE
correo_has_usuario.destinatario_id_usuario = actualUser AND
correo_has_usuario.eliminado =  0 ORDER BY correo.fecha DESC
LIMIT comienzo,termino;
END$$

您好再次感谢您的回答我收到此错误消息#1064 - 您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在'SET @ termino2 = termino附近使用正确的语法; SET @ actualUser2 = actualUser; BEGIN PREPARE stmt'在第8行

1 个答案:

答案 0 :(得分:1)

你错过了第2行VARCHAR的数据长度

例如

IN actualUser varchar(20)

您的限制声明也不正确,并会抛出错误。在存储过程中使用时,限制必须是数字或局部变量。参见

http://dev.mysql.com/doc/refman/5.5/en/select.html

  

在存储的程序中,可以使用指定LIMIT参数   从MySQL开始的整数值例程参数或局部变量   5.5.6。

要做到这一点,你必须将你的参数设置为像

这样的变量
SET @comienzo2 = comienzo;
SET @termino2 = termino;
SET @actualUser2 = actualUser;

然后,不是简单地运行你的select语句,你必须准备它然后执行它。

PREPARE stmt FROM 'SELECT ... LIMIT ?, ?';
EXECUTE stmt USING @comienzo2, @termino2;
DEALLOCATE PREPARE stmt;

你的where声明也是如此。

示例:

DELIMITER $$
CREATE PROCEDURE store(
  IN actualUser varchar(20),
  IN comienzo int,
  IN termino int
)

SET @comienzo2 := comienzo;
SET @termino2 := termino;
SET @actualUser2 := actualUser;

BEGIN
PREPARE stmt FROM 'SELECT
    usuario.nombre,
    LEFT(titulo, 20) as titulo,
    LEFT(mensaje, 20) as mensaje,
    correo.fecha,
    correo.id_correo,
    correo_has_usuario.correo_id_correo,
    correo_has_usuario.destinatario_id_usuario,
    correo_has_usuario.eliminado,
    correo_has_usuario.leido
    FROM
    correo_has_usuario 
    Inner Join correo ON correo_has_usuario.correo_id_correo = 
    correo.id_correo
    Inner Join usuario ON usuario.id_usuario = 
    correo.usuario_id_usuario
    WHERE
    correo_has_usuario.destinatario_id_usuario = ? AND
    correo_has_usuario.eliminado =  0 ORDER BY correo.fecha DESC
    LIMIT ?,?;'
EXECUTE stmt USING @actualUser2, @comienzo2, @termino2;
DEALLOCATE PREPARE stmt;
END;
$$