J'essaie de faire enregistrer des données php sur le serveur. Ces données sont générées via le script js. Cependant, je ne parviens pas à faire créer le fichier par le php. Le message d'erreur que j'obtiens est le suivant: Avertissement: file_put_contents (data /) [function.file-put-contents]: échec de l'ouverture du flux: un répertoire de
J'ai vérifié les autorisations et le php.ini pour les restrictions avec succès nul. Des idées?
Si je change le bit "data /" en "X", le serveur crée un fichier vide nommé X. Ce qui semble étrange. Les commandes utilisées dans le script js proviennent de jsPsych.
Merci beaucoup!
J'ajoute le code:
function saveData(name, data){
var xhr = new XMLHttpRequest();
xhr.open('POST', 'write_data.php');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify({filename: name, filedata: data}));
};
(...)
On_finish:
function(){
saveData('subject-'+subject_id+'.csv', jsPsych.data.get().csv() );
}
<?php
$filename = 'data/'.$_POST['filename'];
$data = $_POST['filedata'];
file_put_contents($filename, $data);
?>
3 réponses
Je ne suis pas un expert de Xhr et de votre façon de le faire. Je connais cependant jQuery, et JS régulier.
Méthode Jquery:
var postName = 'something'; // this is found with $_POST['postName'] in PHP
var postName2 = 'somethingElse';
$.post("path/yourFile.php", {postName:value, postName2:value}, function(data){
if(data == 'success'){
// complete success
} else {
// assessment failed to save
console.log(data);
}
});
Méthodes JS:
La première chose que vous faites, c'est d'ouvrir votre demande ...
var xhr= new XMLHttpRequest();
xhr.open("POST", "write_data.php", true);
Essaye ça...
xhr.open ("POST", "write_data.php", true );
Ensuite, vous pouvez soit utiliser cette façon de procéder ...
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("fname=Wubur&lname=Com");
Ou la manière JSON ...
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify({fname:"Harry", lname:"Potter"}));
YourFile.php (où nous POSTONS):
Si vous utilisez la première méthode (PAS json) ...
<?php
if(isset($_POST['fname']) && isset($_POST['lname']){ // check for post param & permission to create template
// do stuff here...
echo 'success'; // if everything worked
} else {
echo 'I need fname and lname!!!'; // no post params supplied
}
?>
Si vous utilisez la méthode JSON ...
<?php
$data = json_decode(file_get_contents('php://input'), true);
$data2 = json_decode(file_get_contents('php://input'));
// try both, I forget which one it is...
echo "success";
?>
Je suppose que $_POST['filename'];
est vide. L'erreur:
Avertissement: file_put_contents (data /) [function.file-put-contents]: échec de l'ouverture du flux: est un répertoire
Est explicite et montre même data/
. Vous remarquez l'absence de nom de fichier après le "/"? Vérifiez votre courrier entrant.
Plus de détails
Le Super Global $_POST
n'a pas de clé filename
ou cette clé est vide. Cette ligne de code $filename = 'data/'.$_POST['filename'];
produit ceci: data/
. Donc, $_POST['filename']
est vide ou n'existe pas. Utilisez var_dump
ou print_r
pour examiner $_POST
et voir ce qu'il contient.
Le problème semble être lié à votre type de contenu. En PHP, seul un Content-Type
de application/x-www-form-urlencoded
ou multipart/form-data
remplit le {super tableau global $_POST
. Puisque vous dites au serveur que vous envoyez les données via application/json
, vous devez récupérer les données du corps de la demande via:
php://input
Essaye ça:
$params = json_decode("php://input", TRUE);
$filename = 'data/'.$params['filename'];
$data = $params['filedata'];
file_put_contents($filename, $data);
De nouvelles questions
javascript
Pour des questions concernant la programmation dans ECMAScript (JavaScript / JS) et ses divers dialectes / implémentations (hors ActionScript). Veuillez inclure toutes les balises pertinentes dans votre question; par exemple, [node.js], [jquery], [json], etc.