Saving to database via AJAX/jQuery, sending two variables - php

I have this problem that I have multiple fields that updates a database via an AJAX-call. The AJAX call looks like this:
$(".fresheditable").fresheditor("save", function (id, parsedHtml) {
$.ajax({
url: 'save.php',
type: 'POST',
data: {
id: id,
parsedHtml: parsedHtml
}
});
});
The ID value changes depending on what element is being edited. The problem is when the update gets sent to the save.php document. How do I only run the update with the specific ID?
See my save.php:
if($_POST['id']='link')
{
$link = $_POST['parsedHtml']; //get posted data
// query
$sql = "UPDATE buttons SET linkname=? WHERE id=?";
$q = $conn->prepare($sql);
if ($q->execute(array($link,$_SESSION['button'])))
{
echo 1;
}
}
//The next if-statement could look like this:
if($_POST['id']='contactperson')
{
$contactperson = $_POST['parsedHtml']; //get posted data
// query
$sql = "UPDATE buttons SET contactperson=? WHERE id=?";
$q = $conn->prepare($sql);
if ($q->execute(array($contactperson,$_SESSION['button'])))
{
echo 1;
}
}
If more than one ID is sent to the save.php say link and contactperson both if-statements are true and the update sets the same values because the parsedHtml variable.
Is there anything I can do in save.php that can prevent this? Somehow I need to associate the correct parsedHtml with the corresponding id.

The comparison operator in PHP (as well as in Javascript) is == and not =
if($_POST["id"]=="link")

Is it because you're using single equals in your IF tests, which assigns and returns true as a value exists? Not double-equals for comparison?
E.g.
if($_POST['id']=='link')
not
if($_POST['id']='link')

One thing you can use is data attribute i mean
<span item-data="some_id">data</span> now you can select in jquery, the specific item-data from your html to update.

Use else-if structure.
if($_POST['id']='link') {
}
else if($_POST['id']='contactperson') {
}

Related

Ajax post to php to update mysql

I've built an admin page for my site, that contains numerous forms that save, update, delete data into different tables in my database.
Currently i have one PHP file for each function that does the mysql query according to my ajax post command. which is getting a bit out of control.
for example i have a file for saving a new category
$cataddname = $_POST['name'];
$area = $_POST['area'];
$shortname = preg_replace('/\s+/', '_', $cataddname);
$update_category = "INSERT INTO clet_faq_category (id, name, nickname, area) VALUES ('', '$cataddname', '$shortname', '$area')";
mysqli_query($db_connect, $update_category);
my save new category command posts to this file:
then i have a file that saves a category edit:
$cataddname = $_POST['name'];
$area = $_POST['area'];
$id = $_POST['cid'];
$shortname = preg_replace('/\s+/', '_', $cataddname);
$update_category = "UPDATE clet_faq_category SET name='$cataddname', nickname='$shortname', area='$area' WHERE id = '$id'";
mysqli_query($db_connect, $update_category);
And another one to delete a category:
$c_id = $_POST['delete_id'];
$sql_del = "DELETE FROM clet_faq_category WHERE id = '$c_id'";
$del_question = mysqli_query( $db_connect, $sql_del );
then i have an jQuery ajax call that calls the page:
function newcat(){
var id = "answer";
tinymce.execCommand('mceRemoveEditor', true, id);
var category = document.getElementById('newcategory').value;
var area = document.getElementById('area').value;
var dataString = 'name=' + category + '&area=' + area;
$.ajax({
type: "post",
url: "newcat.php?area_id=" + areaid,
data : {
'name': category,
'area': area,
'query' : query
},
cache: false,
success: function(html){
$('#category_table').html(html);
$('#cat-form').text("Category Saved");
}
});
return false;
}
And When you look at them it's pretty much the same thing it's just a mysql query running.
What i'm trying to do is streamline this a little bit, i thought about passing the entire query via ajax to my php file, but that's not an option as anyone that can see my js file will be able to figure out all my queries and table names, and all they need to do is post a query to my php page and damage my entire DB.
so my question is, is there a way to do this in a smarter way maybe creating php functions inside the same file, that has category_delete(), category_add(), category_edit() on the same file and using ajax target each one of those categories, at least all my functions and queries will be on the same spot not in multiple separate files if you know what i mean.
You can do like this create a separate class which perform options for insert delete and update. and on your ajax page call these function like this
$func = new CUD();
switch($_POST['action'])
{
case 'delete':
$func->delete($values..)
case 'update':
$func->update($values..)
case 'delete':
$func->insert($values..)
}
You can have to send extra parameter in ajax as action, this parameter specifies the action
in php
switch($_POST['action'])
{
case 'delete':
.....
}

Update a variable without refresh in PHP

I need to update a variable named $count (in the below code) automatically. When my database update, $count be update immediately because i need to use value of $count in android app so i can't refresh count.php file every time.
<?php
$con=mysql_connect("","","");
mysql_select_db("u607509006_bd1",$con);
$query = "select * from content where status='a'";
$result = mysql_query($query);
$count = mysql_num_rows($result);
echo $count;
mysql_close($con);
?>
Just use a Jquery Ajax Request on the client side like so:
$.ajax({
url: "path/to/code/file.php" // change this to your path to your code
}).done(function(data) {
// This is executed after the ajax request is complete
// data should be the updated value. You can also return other data // types e.g. JOSN
$('#counter').text(data);
});
JS Fiddle Example: https://jsfiddle.net/anik786/nvkdLhv2/2/

How to increment value in database?

I have a table called Stats. Stats has 4 columns: id, ip, count, and date. count is the number of clicks the ip has clicked on the ads on my site. Each time the user clicks on an ad, their count number will increase by 1. How do I increase their count number by 1 and update that in the database? Here is my code and it's not working for some reason. When I click on the div, it doesn't refresh...so the whole block of code isn't executing. Note that I've already captured the user's ip when they entered my site, this is the part where if they clicked my ad, the count is incremented and updated in the database.
<script>
$(document).ready(function()
{
$("#ad").click(function()
{
<?php
$queryTot = "SELECT `count` AS total FROM Stats WHERE ip = '$ip'";
$resultTot = $db->query($queryTot);
$data = $resultTot->fetch_assoc();
$count = $data["total"] + 1;
$insert = $db->prepare("UPDATE Stats(count) WHERE ip = '$ip' VALUES(?)");
$insert->bind_param('i', $count);
$insert->execute();
$insert->close();
?>
location.reload();
})
})
</script>
There is a lot of points to consider in your answer.
But very possibly you should use an AJAX solution to do it, and avoid every SQL queries in your HTML pages, because keeping SQL queries there definitely is not a good pratice, according all basic security and code maintenance POVs.
It is not possible to re-write your code here rightly without knowing your project structure, or even your idea, and you must take this answer as an important start point.
Basically, you must define in your server-side application a method which returns pure data, in a JSON format for example, and then use AJAX to access this method according an event (a click, for example), receive its response and modify your client-side, probably with jQuery and JS.
I hope this answer can help you.
I've written a short example for you that you could continue to build on to accomplish what you need. Here's the basic idea.
HTML
<input type="hidden" id="ip" value="<?php echo $_SERVER['REMOTE_ADDR'];?>"/>
jQuery
var ip = $('#ip').val();
$(document).ready(function(){
$('#ad').on('click',function(){
$.ajax({
type: 'POST',
url: 'ajaxUpdateDatabase.php',
data: 'ip='+ ip,
success: function(response){
console.log(response)
//send the user to the ad's page here for example
//you could use location.href='url-to-add-here';
//or if you really want to reload the page for a reason I fail to understand, use location.reload();
}
});
});
});
PHP (ajaxUpdateDatabase.php)
//please note that using UPDATE requires that there is previously an entry with this IP address.
//example using PDO...
$sql = 'SELECT * FROM stats WHERE ip = ?';
$stmt = $pdo->prepare($sql);
$stmt->execute(array($_POST['ip']));
if($stmt -> rowCount() > 0){
$sql = 'UPDATE stats SET count = count + 1 WHERE ip = ?';
$stmt = $pdo->prepare($sql);
$stmt->execute(array($_POST['ip']));
}
else{
//ip-address was not found in the database
//insert query goes here
}

Assign ajax Response Values to PHP Variables

I'm calling ajax from AddSomething.php file as follows
<script>
var dataValue;
$("#schedule").change(function () {
var value = $('#schedule option:selected').text();
var ajaxCheck = $.ajax({
url: 'processClg.php',
type: 'POST',
dataType: 'json', // processClg.php will return string means change to text
data: { id: value },
success: function(data){
dataValue = data;
console.log(dataValue);
}
});
});
</script>
Getting response in Network as follows
[{
"id": "2",
"scheduleName": "abc",
"subject": "Patho",
"university": "xyz",
"facultyName": "Dr",
"scheduleStartDate": "2015-06-05",
"scheduleEndDate": "2015-06-09"
}]
And in console it is showing [Object]
How can I assign the above values to the following PHP variables present in the same page
<?php
$scheduleStartDate ='';//Here How can i assign respected ajax responsevalue
$scheduleEndDate = '';//Here How can i assign respected ajax response value
$qry = "SELECT * FROM `mytable`
WHERE `university` LIKE ''//Here How can i assign value
ORDER BY `university` DESC,student_name ASC";
?>
processClg.php file code
<?php
include "config.php";
$qry = "SELECT * FROM `schedule` WHERE scheduleName LIKE '".$_POST['id']."'";
$res = mysqli_query($link, $qry);
//echo $res;
while($row = mysqli_fetch_assoc($res))
$test[] = $row;
echo json_encode($test);
?>
You can't assign the result of an Ajax call to PHP variables. The PHP has already run on the server, done it's bit and sent the HTML / JavaScript to the browser. At that point you can no longer use PHP as it's a server side language and will only run on the server. Ajax uses JavaScript, which is a client side language. It only runs after the PHP has finished and the server has sent the HTML / JavaScript to the users browser. JavaScript is executed in the clients browser.
You need to rethink what you're doing and where you're doing it. If you need the results of the Ajax call to do something in PHP then do it in your processClg.php file. You do all your PHP first, then send a response to the browser to display something to the user. If the user doesn't need any sort of confirmation or acknowledgement then you can just send the Ajax request and not bother with a response.
It looks like you're trying to dynamically load some University information. What you should do is put this part:
$scheduleStartDate ='';//Here How can i assign respected ajax responsevalue
$scheduleEndDate = '';//Here How can i assign respected ajax response value
$qry = "SELECT * FROM `mytable`
WHERE `university` LIKE ''//Here How can i assign value
ORDER BY `university` DESC,student_name ASC";
into processClg.php after the first query. Then you get the results of the query and pass them back to your HTML page, like this:
$results = array();
$qry = "SELECT * FROM `mytable`
WHERE `university` LIKE ''
ORDER BY `university` DESC,student_name ASC";
$result = mysqli_query($link, $qry);
while ($row = mysqli_fetch_assoc($result))
{
$results[] = $row;
}
echo json_encode($results);
You can store ajax result in php variable by embedding ajax result div into php tag
<?php
$result='<div id="result"></div>';// Here you embed div in php tag and store in php varible
?>
You cann't do this job as you think the way.
For that , you need to assign the return values to any hidden field form value and submit the form.
Also keep in mind for ajax response data keep in the js variable, you need to pass the parameter async:false

Using the same page as a form landing page and as a normal page

Picture this: You have two different pages. One is the page the form is on. The other one is used as the form's landing page (with GET statement, ex. /newpost.php?recoverPost=115). What you want to do is ignore all the code that is used for the form when there is no ID set. How do I achieve that? I tried with the following PHP If statements:
$id = $_GET['recoverPost'];
if($id != NULL)
{
//yadayada
}
and
$id = $_GET['recoverPost'];
if(isset($id))
{
//yadayada
}
No success. What can I do to detect whether the ?recoverPost is set or not?
Edit: Snippet:
if (isset($_GET['recoverPost']))
{
include('../includes/db_connect.php');
$query_recover = $db->prepare("SELECT title, body, category_id, post_preview FROM deletedPosts WHERE post_id=$id");
$query_recover->execute();
$query_recover->bind_result($title, $body, $category_id, $post_preview);
}
Where did you declare $id? All query string parameters are passed to the $_GET array, so you'd need to check if $_GET['recoverPost'] is set.
if (isset($_GET['recoverPost'])) {
// your code here
}

Categories