PDA

Arată versiune īntreagă : Problema ajax-jquery



da alen
04.03.2011, 17:19
Am incercat sa fac un script cu ajutorul caruia sa aprob/sterg comentariile la articole.
Am reusit eu ceva dar nu imi iese cum vreau eu.
Preiau toate comentariile neaprobate(campul aprobat = 0) cu
while()......

Imi apar comentariile si butoanele APROBA- STERGE, dar functioneaza decat daca dau pe buton incepand de sus in jos(daca incerc sa aprob pe al doilea nu merge) si chiar daca incep in ordinea de mai sus, trebuie sa dau refresh casa pot continua.
Atasez php-urile si js-ul.
Multumesc.

index.php

$result = mysql_query("select * from comentarii where aprobat = '0'");
while($row = mysql_fetch_array($result))
{
$id = $row['id'];
$nume = $row['nume'];
$comentariu = $row['comentariu'];
$email = $row['email'];
echo'
<div>
<p id="raspuns"> </p>
<input type="hidden" name="id" id="id" value="'.$id.'" />
'.$id.'
<input type="text" name="nume" id="nume" size="30" value="'.$nume.'" /><br />
<input type="text" name="email" id="email" size="30" value="'.$email.'" /><br />
<textarea name="comentariu" id="comentariu" rows="5" cols="30">'.$comentariu.'</textarea><br />
<input type="button" value="Aproba" id="aproba" /><input type="button" value="Sterge" id="sterge" />
<img src="images/loading.gif" id="loading" /><br />
</div>';
}

aproba.php

include("c.php");
$id = $_POST['id'];
$nume = $_POST['nume'];
$email = $_POST['email'];
$comentariu = $_POST['comentariu'];

$rezultat = mysql_query("update comentarii set aprobat = 0, comentariu = '$comentariu' where id = '$id'");

if(mysql_affected_rows() == 1)
echo 'aprobat';
else
echo "a intervenit o eroare";

script.js

$(document).ready(function(){
$("#aproba").click(function(){
var id = $("#id").val();
var nume = $("#nume").val();
var email = $("#email").val();
var comentariu = $("#comentariu").val();
comentariu = comentariu.replace(/\n\r?/g, '<br />');
$("#loading").css("visibility","visible");
$.ajax({
type: "POST",
url: "aprob_comment.php",
data: "id="+id+"&nume="+nume+"&email="+email+"&comentariu="+comentariu,
success: function(aprobat){
if(aprobat != 0)
{
structure = '<p id="aprobat">'+aprobat+'</p>';
$("#raspuns").prepend(structure);

}
else
alert("Eroare neasteptata...!");
$("#loading").css("visibility","hidden");
}
});
});
});

micku7zu
05.03.2011, 01:06
ID se foloseste la un singur element. Nu poti avea 2 element-uri cu acelasi ID (defapt poti.. dar vei avea erori ca si in acest caz).

La fiecare comment tu pui un input cu id="id" si cu value="id_ul lui"... iar tu cand preiei id-ul folosesti $("#id") care va lua intotdeauna primul element cu id-ul "id".

Rezolvare: Folosesti clase de genul class="id-nr_id" sau class="id" rel="nr_id"...

Mai jos este codul tau modificat:
index.php

<script type="text/javascript" src="http://code.jquery.com/jquery-1.5.1.min.js"></script>
<script type="text/javascript" src="script.js"></script>
<?php
/* conectare */
$con=mysql_connect("localhost","root","");
mysql_select_db("doru",$con);
/* sfarsit conectare */

$result = mysql_query("select * from comentarii where aprobat = '0'");
while($row = mysql_fetch_array($result))
{
$id = $row['id'];
$nume = $row['nume'];
$comentariu = $row['comentariu'];
$email = $row['email'];
echo '<div class="comentariu c-'.$id.'">
<p class="raspuns"> </p>
'.$id.'
<input type="text" name="nume" class="nume" size="30" value="'.$nume.'" /><br />
<input type="text" name="email" class="email" size="30" value="'.$email.'" /><br />
<textarea name="comentariu" class="comentariu" rows="5" cols="30">'.$comentariu.'</textarea><br />
<input type="button" value="Aproba" class="aproba" rel="'.$id.'"/><input type="button" value="Sterge" class="sterge" />
<img src="images/loading.gif" alt="Loading" id="loading" /><br />
</div>
';
}
?>

aproba.php;


<?php
/* conectare */
$con=mysql_connect("localhost","root","");
mysql_select_db("doru",$con);
/* sfarsit conectare */

$id = $_POST['id'];
$nume = $_POST['nume'];
$email = $_POST['email'];
$comentariu = $_POST['comentariu'];

$rezultat = mysql_query("update comentarii set aprobat = 1, comentariu = '$comentariu' where id = '$id'");

if(mysql_affected_rows() == 1)
echo 'aprobat';
else
echo "a intervenit o eroare";
?>


script.js


$(document).ready(function(){
$(".aproba").click(function(){
id=$(this).attr("rel"); //preluam id-ul
var nume=$(".c-"+id+" .nume").val();
var email = $(".c-"+id+" .email").val();
var comentariu = $(".c-"+id+" .comentariu").val();
comentariu = comentariu.replace(/\n\r?/g, '<br />');
$(".c-"+id+" .loading").css("visibility","visible");
$.ajax({
type: "POST",
url: "aproba.php",
data: "id="+id+"&nume="+nume+"&email="+email+"&comentariu="+comentariu,
success: function(aprobat){
if(aprobat != 0)
{
structure = '<p id="aprobat">'+aprobat+'</p>';
$(".c-"+id+" .raspuns").prepend(structure);

}
else
alert("Eroare neasteptata...!");
$(".c-"+id+" .loading").css("visibility","hidden");
}
});
});
});


Ai mare grija la ce valori primesti... foloseste mysql_real_escape_string... si verifica in fisierul aproba.php astfel incat sa detina drepturile necesare.

da alen
05.03.2011, 12:42
Ai mare grija la ce valori primesti... foloseste mysql_real_escape_string... si verifica in fisierul aproba.php astfel incat sa detina drepturile necesare.

Multumesc @micku7zu. Verific acum ce ai spus tu.

In privinta securitatii ...mai era pana acolo.Prima data ma interesa sa fie functional.


EDIT

Rezolvat si aprobarea si stergerea. Merge cum trebuie.
Asta nu stiam: cum pot adauga fiecarei intrari o anumita clasa. Acum am inteles dar te rog sa imi explici o mica chestie

var nume=$(".c-"+id+" .nume").val();

Inteleg ca este numele clasei+id-ul dar de unde vine .c- ?
Mersi din nou!

micku7zu
05.03.2011, 13:53
am pus c-nr_id de exemplu: c-1, c-3543 ca o prescurtare.. putea fi si coment-nr_id ( coment-1, coment-3543 ) sau putea fi si cnr_id (c1, c3543) ... am pus acel c- in fata deoarece daca tu pe pagina folosesti ajax si la comentarii si la posturi atunci una o sa fie c-id_comment si p-alta id_comment. puteai pune direct numele clasei ca fiind id-ul commentului dar atunci apareau probleme daca aveai si la posturi si la comentarii..

stau tare prost cu explicatiile...

sper ca ai inteles...

mai corect era sa folosesc:

<div class="comentariu" id="c-1">
<div class="comentariu" id="c-3543">

decat

<div class="comentariu c-1">
<div class="comentariu c-3543">


deoarece este unic intotdeauna, iar atunci preluai cu
var nume=$("#c-"+id+" .nume").val();.

micku7zu
05.03.2011, 14:29
index.php


<?php
/* asta ma gandesc ca ai in config.php */
$con=mysql_connect("localhost", "root", "") or die("Nu ma pot conecta");
mysql_select_db("doru", $con) or die('Nu gasesc baza de date');
?>
<html>
<head>
<title>Modificar comenturi</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.5.1.min.js"></script>
<script> // asta este script.js, mi-a fost lene sa fac alt fisier
$(document).ready(function(){
$(".aproba").click(function(){
id=$(this).attr("rel");
divComent=$("#c-"+id); //avem divul comentariului
info=divComent.children(".info");
nume=divComent.children(".nume").val();
email=divComent.children(".email").val();
comentariu=divComent.children(".comentariu").val();
info.html("<img src='loading.png' alt='Loading...'>Se proceseaza...");
$.ajax({
type:"POST",
url:"actiuni.php",
data:"a=aproba&id="+id+"&nume="+nume+"&email="+email+"&comentariu="+comentariu,
success:function(msg){
info.html(msg);
},
error:function(){
info.html("A aparut o eroare!");
}
});
return false;
});

$(".sterge").click(function(){
id=$(this).attr("rel");
info=$("#c-"+id).children(".info");
info.html("<img src='loading.png' alt='Loading...'>Se proceseaza...");
$.ajax({
type:"POST",
url:"actiuni.php",
data:"a=sterge&id="+id,
success:function(msg){
info.html(msg);
},
error:function(){
info.html("A aparut o eroare!");
}
});
return false;
});
});
</script>
<style>
.comentariu{
margin-bottom:30px;
}
</style>
</head>
<body>
<h1>Comentarii</h1>
<?php
$q=mysql_query("SELECT * FROM `comentarii` where aprobat='0'");
while($r = mysql_fetch_array($q)){
$id=$r['id'];
$nume=$r['nume'];
$comentariu=$r['comentariu'];
$email=$r['email'];
echo '<div class="comentariu" id="c-'.$id.'">
<b>'.$id.'.</b><br />
<input type="text" class="nume" value="'.$nume.'" /><br />
<input type="text" class="email" value="'.$email.'" /><br />
<textarea class="comentariu">'.$comentariu.'</textarea><br />
<a href="#" class="aproba" rel="'.$id.'">Aproba</a> | <a href="#" class="sterge" rel="'.$id.'">Sterge</a>
<div class="info"></div>
</div>';
}
?>
</body>
</html>

actiuni.php


<?php
/* asta ma gandesc ca ai in config.php */
$con=mysql_connect("localhost", "root", "") or die("Nu ma pot conecta");
mysql_select_db("doru", $con) or die('Nu gasesc baza de date');

$logat=true; //pentru teste
sleep(1); // pentru teste


if($logat){
if(!isset($_POST['a'])) $_POST['a']='';
switch($_POST['a']){
case 'aproba':
$id=mysql_real_escape_string($_POST['id']);
$nume=mysql_real_escape_string($_POST['nume']);
$email=mysql_real_escape_string($_POST['email']);
$comentariu=mysql_real_escape_string($_POST['comentariu']);

if(mysql_query("UPDATE `comentarii` set aprobat='1', nume='$nume', email='$email', comentariu='$comentariu' where id='$id'"))
echo 'Comentariul a fost aprobat!';
else
echo 'A aparut o eroare de la mysql_query.';

break;
case 'sterge':
$id=mysql_real_escape_string($_POST['id']);

if(mysql_query("DELETE FROM `comentarii` where id='$id'"))
echo 'Comentariul a fost sters';
else
echo 'A aparut o eroare de la mysql_query.';
break;
default:
echo 'A aparut o eroare!';
break;
}
}
else
echo 'Eroare!';
?>