sql раньше был некорректным - кроме одинарных кавычек вокруг заполнителей, перед предложением where
была запятая.
$sql = "UPDATE utlansliste SET
username = :username,
peripherals = :peripherals,
start_date = :start_date,
end_date = :end_date
WHERE id = :id";
Можете ли вы подтвердить, что оператор update действительно вызывается?Попробуйте напечатать sql до / после вызова метода execute
, чтобы программа достигла этой точки
Быстро прошла через PHP и внесла несколько небольших изменений, которые МОГУТ (или могут не помогать).
<?php
try{
session_start();
$id='';
require 'assets/php/database.php';
require 'assets/php/usersession.php';
if( isset( $_GET['id'], $_GET['hostname'] ) ) {
$id = $_GET['id'];
$hostname = $_GET['hostname'];
/*
global $conn;
The `global` keyword is used within functions to allow a variable declared outside the function
to be used within the function... think `scope`
*/
/*
$sql = "SELECT * FROM utlansliste WHERE id='$id';";
As the problem revolves around prepared statements why not use a prepared statement here
and avoid the possibility of sql injection??
*/
$sql='select * from `utlansliste` where id=:id;';
$args=array( ':id' => $id );
$stmt = $conn->prepare($sql);
$res=$stmt->execute( $args );
if( !$res )throw new Exception(' Failed to SELECT records ');
$row = $stmt->fetchAll();
$username = $row[0]['username'];
$peripherals = $row[0]['peripherals'];
$start_date = $row[0]['start_date'];
$end_date = $row[0]['end_date'];
/* make sure that all variables are available... */
if( isset( $_POST['submit'], $username,$peripherals,$start_date,$end_date ) ) {
try {
/* same issue, global is NOT required */
#global $conn;
$sql = "UPDATE utlansliste SET username = :username, peripherals = :peripherals, start_date = :start_date, end_date = :end_date WHERE id = :id";
$stmt = $conn->prepare( $sql );
$stmt->bindParam(":username", $username, PDO::PARAM_STR);
$stmt->bindParam(":peripherals", $peripherals, PDO::PARAM_STR);
$stmt->bindParam(":start_date", $start_date, PDO::PARAM_STR);
$stmt->bindParam(":end_date", $end_date, PDO::PARAM_STR);
$stmt->bindParam(":id", $id, PDO::PARAM_STR);
$result = $stmt->execute();
if ( $result ) {
echo "gg";
} else {
echo "nope";
}
/*header('Location:index.php');*/
}catch(PDOException $exception) {
echo "Error: " . $exception->getMessage();
}
}
}
}catch( Exception $e ){
exit( $e->getMessage() );
}
?>
Между прочим, не обязательно использовать prepared statement
в следующем, потому что нет пользовательских переменных и нет возможности SQL-инъекции
$sql = "SELECT * FROM utlansliste";
$stmt = $conn->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll();
Если был where
тогда это может отличаться ... может быть
update Чтобы помочь при отладке запросов PDO, я использую следующую функцию debugpdo
~ приведен пример ее использования.
<code>function debugpdo( $sql=false, $args=array() ){
if( $sql && !empty( $args ) ){
$params = array();
$keys = array();
foreach( $args as $placeholder => $value ){
if( is_numeric( $value ) )$params[]=sprintf('set @%s=%d;',str_replace( ':', '', $placeholder ), $value );
else $params[]=sprintf('set @%s="%s";',str_replace( ':', '', $placeholder), str_replace( '"',"'", $value ) );
$keys[]=str_replace(':','@',$placeholder);
}
printf(
"<pre><h1>Copy & Paste this SQL into mySQL GUI Application</h1>%s\n\n%s;
", implode (PHP_EOL, $ params), str_replace (array_keys ($ args), $ keys, $ sql));}} $ sql =" update `utlansliste` set` username` =: username, `периферийные устройства = =: периферийные устройства, `start_date` =: start_date,` end_date` =: end_date, где `id` =: id"; $ args = array (': username' => $ username, ': периферийные устройства' => $ периферийное устройство, ':start_date '=> $ start_date,': end_date '=> $ end_date,': id '=> $ id); / * Для отладкиsql, раскомментируйте это и выполните ... * / exit (debugpdo ($ sql, $ args));/ * код продолжается ... * / $ stmt = $ conn-> prepare ($ sql);$ result = $ stmt-> execute ($ args);