0

EDITED to further understand the issue.

I am trying to retrieved data from database and update a single column.

column1 | column2 | column3 
value1  | value1  | -------
value2  | value2  | -------   <=== this column3 rows does not have value in database yet so it will be blank when I retrieved the data

Now I would like to update column3 rows by putting values to it and send it back to the database with the new value in column3 rows.

The current code that I am using now can only retrieved and update a single ID and I'm stuck here. What I want to happen is to retrieved multiple ID's and update the same column for all of the ID's with different values.

Here is a sample of the code that I am using to retrieved data,

$(document).ready(function(){
        $("#RetrieveList").on('click',function() {
            var status = $('#status').val();
            var date = $('#Date').val();
            var date1 = $('#Date1').val();
            $.post('retrieve.php',{status:status, date:date, date1:date1}, function(data){
            $("#results").html(data);
            });
            return false;
        });

This is the PHP code,

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "sample_db";

// check data before use it and convert from string to expected type, use try, not like here:
$date = $_POST['date'];
$date1 = $_POST['date1'];
// use valid data to select rows
try {
    //1. connect to MySQL database
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

    //2. set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //3. create query string (here is answer on your question)
    $sql = 'SELECT column1, column2, column3 FROM sample_table WHERE scheduled_start_date BETWEEN :d1 AND :d2';

    //4. prepare statement from query string
    $stmt = $conn->prepare($sql);

    //5. bind optional parameters
    //if ($status != 'All') $stmt->bindParam(':st', $status);

    //6. bind parameters
    $stmt->bindParam(':d1', $date);
    $stmt->bindParam(':d2', $date1);

    //7. execute statement
    $stmt->execute();

    //8. returns an array containing all of the result set rows 
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

    //get count of rows
    $numrow = count($result);

    //print array - there is many solution to print array,
    //to debug you can do: 
    //print_r($result);

} catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}
$conn = null;

if($numrow == 0) 
  echo "No results found.";
else 
  echo "Count: $numrow</br>";
{

echo "<table width='auto' cellpadding='1px' cellspacing='0px' border=1 align='center'>
<tr>
<!--<th align='center'><input id=checkall name=checkall id=checkall type=checkbox value='' /></th>-->
<th align='center'><strong>Column1</strong></th>
<th align='center'><strong>Column2</strong></th>
<th align='center'><strong>Column3</strong></th>
</tr>"; 

foreach ($result as $row => $info) {
echo "<form action='crqretrieve_status.php' method='post'>";
echo"<tr>"; 
echo  "<td align='center'>" . $info['column1'] . "<input type=hidden name=column1 value=" . $info['column1'] . " </td>";
echo  "<td align='center'>" . $info['column2'] . "<input type=hidden name=column2 value=" . $info['column2'] . " </td>"; 
echo  "<td align='center'>" . "<input name=column3 value='' </td>";
echo "</tr>"; 
echo "</form>";
}
}
echo "</table>";

?>

From the code above, it has name=column3 value='', which I want then to assign a value and save it to db.

Tried searching around and I'm not sure how a case would be useful as my update would depend on the ID's.

Here is the code that I am using for a single query update and I dont know how to associate it to my code above. I would appreciate any help on this.

// if the 'id' variable is set in the URL, we know that we need to edit a record
if (isset($_GET['id']))
{
// if the form's submit button is clicked, we need to process the form
if (isset($_POST['submit']))
{
// make sure the 'id' in the URL is valid
if (is_numeric($_POST['id']))
{
// get variables from the URL/form
$id = $_POST['id'];
$column1 = $_POST['column1'];
$column2 = htmlentities($_POST['column2'], ENT_QUOTES);
$column3 = htmlentities($_POST['column3'], ENT_QUOTES);
$column4 = htmlentities($_POST['column4'], ENT_QUOTES);

// check that fields are not empty
if ($column1 == '' || $column2 == '' || $column3 == ''|| $column4 == '')
{
// if they are empty, show an error message and display the form
$error = 'ERROR: Please fill in all required fields!';
renderForm($column1, $column2, $column3, $column4, $error, $id);
}
else
{
// if everything is fine, update the record in the database
if ($stmt = $mysqli->prepare("UPDATE sample_table SET column1 = ?, column2 = ?, column3 = ?, column4 = ?
WHERE id=?"))
{
$stmt->bind_param("ssssi", $column1, $column2, $column3, $column4, $id);
$stmt->execute();
$stmt->close();
}
// show an error message if the query has an error
else
{
echo "ERROR: could not prepare SQL statement.";
}

// redirect the user once the form is updated
header("Location: list.php");
}
}
// if the 'id' variable is not valid, show an error message
else
{
echo "Error!";
}
}
// if the form hasn't been submitted yet, get the info from the database and show the form
else
{
// make sure the 'id' value is valid
if (is_numeric($_GET['id']) && $_GET['id'] > 0)
{
// get 'id' from URL
$id = $_GET['id'];

// get the record from the database
if($stmt = $mysqli->prepare("SELECT column1, column2, column3, column4 FROM sample_table WHERE id=?"))
{
$stmt->bind_param("i", $id);
$stmt->execute();

$stmt->bind_result($column1, $column2, $column3, $column4);
$stmt->fetch();

// show the form
renderForm($column1, $column2, $column3, $column4, NULL, $id);

$stmt->close();
}
// show an error if the query has an error
else
{
echo "Error: could not prepare SQL statement";
}
}
// if the 'id' value is not valid, redirect the user back to the view.php page
else
{
header("Location: list.php");
}
}
}

// close the mysqli connection
$mysqli->close();
testyummy
  • 21
  • 5
  • Your explanation is a bit confusing, you are looking to update and select multiple rows by ID's? – MinistryOfChaps Aug 07 '17 at 13:50
  • So what is the problem? Where are you experiencing trouble? Are there any errors? Describe what the desired end result is and what the result is now. – Glubus Aug 07 '17 at 13:51
  • I am trying to select records from database and update a single column based on the ID. It is currently working when updating a single ID but what i want is to retrieved multiple ID's and update a single column with different values. I dont know how to proceed already. – testyummy Aug 07 '17 at 13:54

1 Answers1

0

There are several ways to do what you want to do:

One row at a time

You can update one row at a time. You prepare the query once like you already did but calls the execute() method several times, always with different values. The code would look something like that:

$column1Values = array();
$column1Values[42] = "abc";  // key is the id in the database
$column1Values[306] = "def";
// ...

$column2Values = array();
$column2Values[42] = "ghi";
$column2Values[306] = "jkl";
// ...

if ($stmt = $mysqli->prepare("UPDATE sample_table SET column1 = ?, column2 = ? WHERE id=?"))
{
    $stmt->bind_param("ssi", $column1, $column2, $id);
    for ($i=0; $i<count($column1Values); $i++) {
        $column1 = $column1Values[$ids[$i]];
        $column2 = $column2Values[$ids[$i]];
        $id = $ids[$i];
        $stmt->execute();
    }
    $stmt->close();
}

One update query to rule them all

You can build a super query as described on MySQL update case help. However it might be extreme difficult to build such a SQL query dynamically, not to mention that you have to deal with SQL injections on your own.

Progman
  • 16,827
  • 6
  • 33
  • 48
  • will this be applicable with the issue that I have... please see my Edits to fully understand it. – testyummy Aug 08 '17 at 11:46
  • @testyummy You can update one row at a time with a `for` loop or update all row at once using one query which contain the `CASE` or `WHEN` keyword. The choice is yours, however I suggest to use the "update one row at a time in a loop" approach. – Progman Aug 08 '17 at 15:42