2010-05-06 5 views
0

Ceci est probablement facile pour vous les gars, mais je ne peux pas le comprendre. Je veux enregistrer le nom de fichier d'une image sur sa propre ligne dans la base SQL.jQuery - Enregistrer en SQL via PHP

Fondamentalement, je me connecte au site où j'ai mon propre userID. Et chaque utilisateur a sa propre colonne pour les images d'arrière-plan. Et l'utilisateur peut choisir sa propre image s'il le veut. Donc, fondamentalement, lorsque l'utilisateur clique sur l'image qu'il veut, un événement jquery click se produit et un appel ajax est fait à un fichier php qui est censé prendre en charge la mise à jour réelle. La ligne de chaque utilisateur existe toujours, il n'y a donc qu'une mise à jour des données nécessaires. D'abord, je collectionne le nom de fichier de la propriété css 'background-image' et je le scinde donc je n'ai que le nom du fichier. Je puis stocker ce nom de fichier dans une variable que j'appelle « nom » qui est ensuite transmis à cet extrait jQuery:

$.ajax({ 
     url: 'save_to_db.php', 
     data: filename, 
     dataType:'Text', 
     type: 'POST', 
     success: function(data) { 
      // Just for testing purposes. 
      alert('Background changed to: ' + data); 
    } 

    }); 

Et c'est le php qui enregistre les données:

<?php 
require("dbconnect.php"); 

$uploadstring = $_POST['filename']; 

mysql_query("UPDATE brukere SET brukerBakgrunn = '$uploadstring' WHERE brukerID=" .$_SESSION['id']); 
mysql_close(); 
?> 

Fondamentalement, chaque l'utilisateur a son propre identifiant et cela s'appelle 'brukerID' La table tout est dedans est appelée 'brukere' et la colonne que je suis supposé mettre à jour est celle appelée 'brukerBakgrunn'

Quand je viens de lancer l'extrait javascript , Je reçois cette boîte de message en retour whe re il dit:

Contexte changé:
Attention: session_start() [function.session-start]: Impossible d'envoyer le limiteur cache de session - têtes déjà envoyés (output started à /var /www/clients/client2/web8/web/save_to_db.php:1) dans /var/www/clients/client2/web8/web/access.php en ligne

C'est dbconnect.php

<?php 
$con = mysql_connect("*****","******","******"); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 

mysql_select_db("****", $con); 
require("access.php"); 
?> 

Et ceci est access.php:

<?php 
// Don't mess with ;) 
session_start(); 

if($_REQUEST['inside']) session_destroy(); 

session_register("inside"); 
session_register("navn"); 
if($_SESSION['inside'] == ""){ 
    if($_POST['brukernavn'] and $_POST['passord']){ 
    $query = "select * from brukere where brukerNavn='" . $_POST['brukernavn'] . "' and brukerPassord = md5('" . $_POST['passord'] ."')"; 
    $result = mysql_query($query);  
    if(!$result) mysql_error(); 
    $rows = @mysql_num_rows($result); 
     if($rows > 0){ 
    $_SESSION['inside'] = 1; 
    $_SESSION['navn'] = mysql_result($result,"navn"); 
    $_SESSION['id'] = mysql_result($result,"id"); 
    Header("Location: /"); 
    } else { 
    $_SESSION['inside'] = 0; 
    $denycontent = 1; 
    } 
    } else { 
    $denycontent = 1; 
    } 
} 

if($denycontent == 1){ 
include ("head.php"); 
print(' 
<body class="bodylogin"> 
    content content content  
</body> 
'); 
include ("foot.php"); 
exit; 
} 
?> 

Répondre

2
mysql_query("UPDATE brukere SET brukerBakgrunn = $uploadstring WHERE brukerID=" .$_SESSION['id'] .""; 

devrait être

mysql_query("UPDATE brukere SET brukerBakgrunn = $uploadstring WHERE brukerID=" .$_SESSION['id']); 

parenthèse fermante est manquante et les citations ("") sont inutiles.

En savoir plus sur SQL injection Afin de rendre votre application sûre.

EDIT:

<?php 
require("dbconnect.php") 
?> 

<?php 

Ce code envoie (? La partie entre> et < php) une nouvelle ligne à la sortie (il est le même que echo "\ n") qui n'est pas autorisée si vous voulez écrire dans une variable de session en conséquence.

+0

+1, j'ai modifié pour corriger votre faute de frappe et je voulais commenter sur l'injection. Mais vous avez déjà mis le truc d'injection et accidentellement annulé ma correction ;-) –

+0

Collaboration trop rapide :-) –

+0

Ok, j'ai mis à jour le premier post. Je reçois un message différent de la méthode ajax. Il s'agit d'hos il ne peut pas envoyer de limiteur de cache de session, l'en-tête déjà envoyé. Et les données ne sont pas mises à jour non plus. Et si je supprime le 'require ("dbconnect.php") du fichier php, tout ce que je reçois en retour d'ajax n'est rien. Donc, il semble que ce soit nécessaire. –

0

vous avez oublié la fermeture ')' dans votre ligne mysql_query!

mysql_query("UPDATE brukere SET brukerBakgrunn = $uploadstring WHERE brukerID=" .$_SESSION['id']); 

Vous n'avez pas besoin du. "" À la fin de votre requête.

2

Gros problème de sécurité!

Vous n'avez pas cité et échappé à l'entrée de la requête MySQL. Je pourrais facilement hacker la fin, empiler une autre requête, et supprimer votre base de données entière!

En outre, il vous manque la parenthèse de fin à la fin de mysql_query().

+0

Et comment allez-vous mettre votre requête dans son ID de variable de session? Cela pourrait être vérifié et non vicié. – Konerak

+1

Pourquoi session? La chaîne de téléchargement provient des données de publication. –

+0

Alors? Même le '$ uploadString' n'est pas entre guillemets + échappé; Je pourrais facilement pirater celui-là. –

1

Retirez la ligne vide avant session_start():

?> 

<?php 
+0

Ne fait rien car il n'y a pas de ligne vide avant session_start(); Edit: Désolé, je comprends ce que vous voulez dire maintenant :) Fixé celui-là. –

0
require("dbconnect.php") 

devrait être

require("dbconnect.php"); 
+0

Si je le fais, le même message d'erreur s'affiche à propos de l'option 'Impossible d'envoyer le limiteur de cache de session' s'affiche à nouveau. –

1

L'erreur d'origine est due à une virgule manquant sur la ligne exigent. Comme d'autres l'ont dit, vous devez en apprendre davantage sur l'injection sql et l'utilisation d'espaces réservés. Ne prenez pas l'habitude d'utiliser des données soumises sans utiliser d'espace réservé ou en échappant d'abord.

+0

Je n'ai même pas d'habitude! Je ne fais que tâtonner, essayant d'apprendre tout ça. –

1
<?php 
//require_once("dbconnect.php"); 

$uploadstring = $_REQUEST['filename']; 

$db_pswd = 'xxx-xxx-xxx'; 
$db_user = 'john_doe'; 
$db_table = 'my_table'; 

$con = mysql_connect('localhost' , $user , $pswd); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 

mysql_select_db($db_table , $con); 

mysql_query(" UPDATE brukere SET brukerBakgrunn = '".$uploadstring."' 
WHERE brukerID = '".$_SESSION['id']."' "); 

mysql_close($con); 
?> 

Je pense que vous devez utiliser un nouveau code! le vôtre est compromis! ;-))

+0

Eh bien, je pense que j'ai besoin de comprendre comment tout cela fonctionne. Je veux dire, la première partie de votre code est fondamentalement ce que je fais aussi, avant de se connecter au site. Puis, après que je me suis connecté, la connexion est-elle toujours ouverte? Aurais-je besoin de remettre les propriétés de connexion à nouveau? –