J'essaye d'exécuter une requête qui va me créer une fonction :
DELIMITER |
DROP FUNCTION IF EXISTS get_distance_meters|
CREATE FUNCTION get_distance_meters (lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2 DOUBLE) RETURNS DOUBLE
BEGIN
DECLARE rlo1 DOUBLE;
DECLARE rla1 DOUBLE;
DECLARE rlo2 DOUBLE;
DECLARE rla2 DOUBLE;
DECLARE dlo DOUBLE;
DECLARE dla DOUBLE;
DECLARE a DOUBLE;
SET rlo1 = RADIANS(lng1);
SET rla1 = RADIANS(lat1);
SET dlo = (rlo2 - rlo1) / 2;
SET dla = (rla2 - rla1) / 2;
SET a = SIN(dla) * SIN(dla) + COS(rla1) * COS(rla2) * SIN(dlo) * SIN(dlo);
RETURN (6378137 * 2 * ATAN2(SQRT(a), SQRT(1 - a)));
END|
DELIMITER ; SET rlo2 = RADIANS(lng2);
SET rla2 = RADIANS(lat2);
SET dlo = (rlo2 - rlo1) / 2;
SET dla = (rla2 - rla1) / 2;
SET a = SIN(dla) * SIN(dla) + COS(rla1) * COS(rla2) * SIN(dlo) * SIN(dlo);
RETURN (6378137 * 2 * ATAN2(SQRT(a), SQRT(1 - a)));
END|
DELIMITER ;
Cette fonction fonctionne très bien si je la balance sur phpmyadmin, mais pas quand j'essaye de la lancer avec via doctrine :
$connection = Doctrine_Manager::getInstance()->getCurrentConnection();
$pdo = $connection->getDbh();
$stmt = $pdo->prepare($sql); // $sql est ma fonction
$stmt -> execute(array());
Ni directement via PDO :
$bdd = new PDO('mysql:host=localhost;dbname=my_db', 'me', 'secret');
$bdd->query($sql);
Où j'obtiens l'erreur :
Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER |
DROP FUNCTION IF EXISTS get_distance_meters|
CREATE FUNCTION get_dis' at line 1.
Il semblerai qu'il n'accepte pas "DELIMITER |"...
Quelqu'un aurait une idée d'où vient le problème et/ou comment le résoudre s'il vous plaît ?
Merci d'avance
MysterTy a sa mysterty-cave. Vous êtes célibataire ? Wantedlove est fait pour vous. C'est 100% gratuit !
Parce que je suis en train de créer le projet sous symfony, et j'aimerai bien que la création de la fonction sql soit automatisée par une task à chaque fois que je ferais un build all. Ça devient fatiguant de devoir recopier la fonction à chaque fois ^^'
MysterTy a sa mysterty-cave. Vous êtes célibataire ? Wantedlove est fait pour vous. C'est 100% gratuit !
Il ne faut pas oublier de changer le délimiteur ";" par défaut et mettre "|" (voir copie d'écran). Ce délimiteur permet de séparer plusieurs instructions SQL. Si vous laissez le délimiteur par défaut vous aller avoir une erreur de syntaxe car l'instruction CREATE FUNCTION contient des ";" dans son bloc BEGIN/END.
Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention. Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé. Pour plus d'informations, nous vous invitons à lire les règles générales du forum
Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.
Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre. En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.
Au lieu de déterrer un sujet il est préférable :
soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
soit de créer un nouveau sujet décrivant votre propre contexte
ne pas répondre à un déterrage et le signaler à la modération
Pas d'aide concernant le code par MP, le forum est là pour ça :)