logo
31.07.2020 14:12
1
Zdravím, mám zde tento PHP kod:

<?php
//update.php

include('database_connection.php');

if(isset($_POST["image_id"]))
{
$old_name = get_old_image_name($connect, $_POST["image_id"]);
$file_array = explode(".", $old_name);
$file_extension = end($file_array);
$new_name = $_POST["image_name"] . '.' . $file_extension;
$query = '';
if($old_name != $new_name)
{
$old_path = '../../uploads/' . $old_name;
$new_path = '../../uploads/' . $new_name;
if(rename($old_path, $new_path))
{
$query = "
UPDATE soubory
SET image_name = '".$new_name."', image_description = '".$_POST["image_description"]."'
WHERE image_id = '".$_POST["image_id"]."'
";
}
}
else
{
$query = "
UPDATE soubory
SET image_description = '".$_POST["image_description"]."'
WHERE image_id = '".$_POST["image_id"]."'
";
}

$statement = $connect->prepare($query);
$statement->execute();
}
function get_old_image_name($connect, $image_id)
{
$query = "
SELECT image_name FROM soubory WHERE image_id = '".$image_id."'
";
$statement = $connect->prepare($query);
$statement->execute();
$result = $statement->fetchAll();
foreach($result as $row)
{
return $row["image_name"];
}
}

?>

Aktuálně to funguje jako PDO, jak bych to mohl změnit, aby to fungovalo jako mysqli?

Co se právě děje na Webtrhu?

31.07.2020 14:18
2
V database_connection.php máš nejspíše instancovaný objekt PDO do proměnné $connect, místo toho udělej

Kód:
new Mysqli();
Potom ještě tě chci upozornit na to, že ikdyž máš "prepared" statements, nemáš je implementované správně. Kód je tedy náchylný na SQL injection. Správně místo proměnné se do kódu dá
Kód:
?
a následně dosadíš proměnné metodou. Pak budeš mít ošetřenou alespoň tuto část.
31.07.2020 14:22
3
Původně odeslal Pavel Janků
V database_connection.php máš nejspíše instancovaný objekt PDO do proměnné $connect, místo toho udělej

Kód:
new Mysqli();
Potom ještě tě chci upozornit na to, že ikdyž máš "prepared" statements, nemáš je implementované správně. Kód je tedy náchylný na SQL injection. Správně místo proměnné se do kódu dá
Kód:
?
a následně dosadíš proměnné metodou. Pak budeš mít ošetřenou alespoň tuto část.
Databázi mám takto:

$conn = mysqli_connect($servername, $dBUsername, $dBPassword, $dBName);
$conn -> set_charset("utf8");

if (!$conn) {
die("Chyba při připojení s databázi MySql: ".mysqli_connect_error() );
}

ale to nekomunikuje s kodem výše... i když to $connect změním na $conn...

---------- Příspěvek doplněn 31.07.2020 v 14:27 ----------

Chyba bude asi tady:

$statement = $connect->prepare($query);
$statement->execute();
$result = $statement->fetchAll();
foreach($result as $row)

---------- Příspěvek doplněn 31.07.2020 v 14:31 ----------

Tak už jsem to vyřešil :) Kdyby to někdo potřeboval:

if(isset($_POST["image_id"]))
{
$old_name = get_old_image_name($conn, $_POST["image_id"]);
$file_array = explode(".", $old_name);
$file_extension = end($file_array);
$new_name = $_POST["image_name"] . '.' . $file_extension;
$sql = '';
if($old_name != $new_name)
{
$old_path = '../../uploads/' . $old_name;
$new_path = '../../uploads/' . $new_name;
if(rename($old_path, $new_path))
{
$sql = "
UPDATE soubory
SET image_name = '".$new_name."', image_description = '".$_POST["image_description"]."'
WHERE image_id = '".$_POST["image_id"]."'
";
}
}
else
{
$sql = "
UPDATE soubory
SET image_description = '".$_POST["image_description"]."'
WHERE image_id = '".$_POST["image_id"]."'
";
}

$result = $conn->query($sql);
}
function get_old_image_name($conn, $image_id)
{
$sql = "
SELECT image_name FROM soubory WHERE image_id = '".$image_id."'
";
$result = $conn->query($sql);

foreach($result as $row)
{
return $row["image_name"];
}
}

?>
31.07.2020 14:32
4
1) používej proměnnou $connect, když ji následně používáš na dotazy do dtb.
2) použij objektový zápis, aby ti to komunikovalo, tzn.
PHP kód:
$connect = new Mysqli($servername$dBUsername$dBPassword$dBName); 
viz https://www.php.net/manual/en/class.mysqli.php

---------- Příspěvek doplněn 31.07.2020 v 15:33 ----------

Opravte si ty SQL dotazy, nebo se budete divit, až Vám někdo dropne DB :)