2010-10-27 5 views
4

Je sais que c'est un sujet populaire, mais je n'ai pas encore trouvé de réponse complètement complète. J'essaie de créer un moyen simple pour nos «clients» de placer une carte Google sur leur site Web, qui trace la position de nos clients (ou d'un sous-ensemble) sur la carte. Les clients sont dans une base de données MySQL qui est transformée en XML à la volée par un script PHP (selon l'exemple de Google). Cela fonctionne très bien sur mon site Web, mais lorsque je l'essaie sur un autre site Web, xmlHTTPRequest n'est pas autorisé à regarder le PHP comme sur un autre domaine.Même politique d'origine - JavaScript appelant PHP

Je peux contourner cela en écrivant un autre fichier PHP sur l'autre domaine qui lit simplement le fichier PHP sur le domaine d'origine. Mais tous nos clients n'auront pas PHP sur leurs serveurs. Est-il possible que je puisse retourner les résultats XML de notre base de données en utilisant JavaScript?

Quelques points:

  1. Le JavaScript qui rend le XMLHttpRequest se trouve toujours sur notre serveur - nos clients un lien vers elle d'une balise de script. Je pensais que cela pourrait être suffisant, mais l'origine (selon Chrome, de toute façon) est toujours considéré comme domaine # 2

  2. C'est génial: si j'utilise une référence absolue dans le xmlHTTPRequest (par exemple request.open ('GET', 'http://mydomain.com/api/foo.php', true)) alors il échouera dans IE, mais si j'utilise une référence relative ('/api/foo.php') ça marchera .

  3. Je ne sais pas assez à ce sujet, mais pourrais-je utiliser JSON? J'ai vu: 'script src = "http: //..../someData.js? Callback = some_func"' mais je ne sais pas comment, je ferais ressembler 'someData.js' comme JSON? (Je pense beaucoup en termes de fonctions, ce qui est probablement incorrect?). J'ai essayé d'ajouter: header ("Access-Control-Allow-Origin: *"); au sommet du PHP qui sort le XML, mais ça ne fait pas grand-chose que je puisse dire!

  4. Si j'utilise un wrapper PHP sur le serveur du client, quel est l'avantage d'utiliser une requête cURL, plutôt que simple file_get_contents ou fopen?

Désolé, beaucoup de questions, mais des instructions y seraient grandement appréciées.

merci Massive,

Mat

+0

# 3 est appelé JSONP, et qui ressemble à ce que vous avez besoin. – StriplingWarrior

Répondre

6

Un moyen facile de contourner cela est de laisser votre script PHP retour quelque chose comme:

callback_function(YOUR_DATA); 

Ensuite dans le script JS inclus sur le site de clients que vous insérez dynamiquement une <script> qui a src pointant vers votre script PHP:

(function() { 
    var scriptElement = document.createElement('script'); 
    scriptElement.type = 'text/javascript'; 
    scriptElement.async = true; 
    scriptElement.src = 'http://example.org/yourScript.php?data=...'; 
    var container  = document.getElementsByTagName('script')[0]; 
    container.parentNode.insertBefore(scriptElement, container); 
})(); 

Cette technique est appelée JSONP et devrait faire exactement ce que vous voulez;)

Une autre contourner le problème serait permettre XMLHttpRequest inter-domaine dans la politique de sécurité du contenu. Mais je pense que seul Firefox 4 le supporte maintenant.

+0

Oui, c'est la façon de le faire. Incorporez le script de votre domaine et, si nécessaire, transmettez les variables en tant que paramètres au php. –

+0

Cela a l'air génial. Je pense que ça va me prendre un peu de temps pour le comprendre exactement, mais je [pense que je!] En général l'idée. Merci Nikki. – Mat

+0

Ok, alors comme le script se charge de manière asynchrone, des erreurs sont lancées lorsque j'essaie d'accéder aux données json. Quand devrait-il être disponible/comment j'attends jusqu'à ce qu'il soit disponible avant que j'essaie d'y accéder? Aussi, si je fais comme 'callback_fn ({mydata})' on me dit que 'callback_fn' n'est pas défini. – Mat

0

JavaScript est côté client, mais la base de données n'est pas. JavaScript ne peut pas tirer directement d'une base de données MySQL.

1

Pouvez-vous utiliser JSON au lieu de XML? Si oui, votre option 3) sera probablement votre meilleur pari. Cette approche comporte des risques de sécurité et ne devrait être utilisée que pour des sources connues et fiables.

More reading: http://www.codeproject.com/KB/aspnet/JSONToJSONP.aspx

Questions connexes