Novosti:

Aktualne Joomla! verzije: 3.10.11 i 4.2.6

Main Menu

Ne radi update qsl

Autor erbi, 24. Kolovoz 2017, 21:08

0 Članovi i 1 Gost pregledava ovu temu.

erbi

Dal mi ko zna reči zašto mi ovo ne radi? Greška:
PHP Warning:  mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement
PHP Warning:  mysqli_stmt::execute(): (HY000/2031): No data supplied for parameters in prepared statement
i još kod:

Adresa:<br>
<input type="text" name="naslov" style="width:95%" value="<?php echo $adresa?>" required><br>

<br>Više o tome 1:<br>
<textarea name="sestavine" cols="120" rows="10" required> <?php echo $vot1?></textarea><br>

<br>Više o tome 2:<br>
<textarea name="priprava" cols="120" rows="10" required> <?php echo $vot2?></textarea><br>
<input type="submit" name="submit" value="Submit" />

$stmt->bind_param('sss', $adresa, $vot1, $vot2);
$stmt->execute();
$stmt->close();


U sql ima: id, adresa, vot1, vot2, id je auto increment

Hvala svima za pomoč

Bernard [ExaByte]

Dobar ti dan!

Idemo redom:

1) Fali podatak kako ti izgleda $stmt->prepare() ??
2) U ovom kratkom komadu koda ne vidim da filtriraš podatke koji dolaze iz forme. Ako ih zaista ne filtriraš - imaš potencijalne SQL injection i druge sigurnosne propuste. Ne treba se pouzdati da su prepared statements 100% otporni na SQL injection, postoje situacije kad ih je moguće zeznuti. Ako mene pitaš filtriranje bilo kojih ulaznih varijabli od klijenata je obavezno.
3) I zašto ne koristiš joomlin objekt za komunikaciju s bazama?

erbi

1. ovdje je cjeli kod:

<?php
/*
Allows the user to both create new records and edit existing records
*/

// connect to the database
include("connect-db.php");

// creates the new/edit record form
// since this form is used multiple times in this file, I have made it a function that is easily reusable
function renderForm($naslov ''$sestavine =''$priprava ''$error ''$id '')
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<style>
body{
font-family:verdana;
margin:0px;
}

.form-wrapper{
margin:1px;
}

.form-wrapper label{
display:block;
font-size:14px;
}

.form-wrapper input[type=text], .form-wrapper input[type=email] .form-wrapper input[type=textarea]{
margin-bottom:5px;
width:180px;
//height:20px;
border:3px solid #eeeeee;
font-size:16px;
}
.form-wrapper span{
color:#ee0000;
}

.form-wrapper input[type=submit]{
display:block;
margin-top:5px;
border:0px;
background:#ee0000;
color:#ffffff;
height:30px;
border-radius:5px;
}

.form-wrapper input[type=submit]:hover{
background:#ee0022;
}

.form-wrapper textarea{
border:3px solid #eeeeee;
font-size:16px;
}

#loading-img{
display:none;
}

.response_msg{
margin-top:10px;
font-size:16px;
background:#E5D669;
color:red;
width:500px;
padding:3px;
display:none;
}

.center {
margin: auto;
width: 90%;
border: 2px solid green;
padding: 10px;
border-radius: 25px;
}
</style>
<title>
<?php if ($id != '') { echo "Uredi recept"; } else { echo "Dodaj nov recept"; } ?>
</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
<div class="center">
<div class="form-wrapper">
<h1><?php if ($id != '') { echo "Uredi recept"; } else { echo "Dodaj nov recept"; } ?></h1>
<?php if ($error != '') {
echo 
"<div style='padding:4px; border:1px solid red; color:red'>" $error
"</div>";
?>


<form action="" method="post">
<div>
<?php if ($id != '') { ?>
<input type="hidden" name="id" value="<?php echo $id?>" />
<p>ID: <?php echo $id?></p>
<?php ?>

Naslov recepta:<br>
<input type="text" name="naslov" style="width:95%" value="<?php echo $naslov?>" required><br>

<br>Sestavine:<br>
<textarea name="sestavine" cols="120" rows="10" required> <?php echo $sestavine?></textarea><br>

<br>Priprava:<br>
<textarea name="priprava" cols="120" rows="10" required> <?php echo $priprava?></textarea><br>


<input type="submit" name="submit" value="Vpiši popravljen recept" />
</div>
</form>
</div>
</div>
</body>
</html>

<?php }



/*

EDIT RECORD

*/
// 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'];
$naslov htmlentities($_POST['naslov'], ENT_QUOTES);
$sestavine htmlentities($_POST['sestavine'], ENT_QUOTES);
$priprava htmlentities($_POST['priprava'], ENT_QUOTES);

// check that firstname and lastname are both not empty
if ($naslov == '' || $sestavine == '' || $priprava == '')
{
// if they are empty, show an error message and display the form
$error 'NAPAKA: Podatke vnesite v vsa polja!';
renderForm($naslov$sestavine$priprava$error$id);
}
else
{
// if everything is fine, update the record in the database


if ($stmt $mysqli->prepare("UPDATE recepti SET naslov = ?, sestavine = ?, priprava = ?
WHERE id=?"
))
{
/*
$sql = "UPDATE recepti SET naslov='$naslov' sestavine='$sestavine' priprava='$priprava' WHERE id='$id'";
$result=mysqli_query($sql);
mysqli_query($query);
*/

$stmt->bind_param('sss''$naslov''$sestavine''$priprava');
$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: view.php");
}
}
// if the 'id' variable is not valid, show an error message
else
{
echo 
"Napaka!";
}
}
// 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 recod from the database
if($stmt $mysqli->prepare("SELECT * FROM recepti WHERE id=?"))
{
$stmt->bind_param("i"$id);
$stmt->execute();

$stmt->bind_result($id$naslov$sestavine$priprava);
$stmt->fetch();

// show the form
renderForm($naslov$sestavine$pripravaNULL$id);

$stmt->close();
}
// show an error if the query has an error
else
{
echo 
"Napaka: Ne morem popraviti zapisa v bazi";
}
}
// if the 'id' value is not valid, redirect the user back to the view.php page
else
{
header("Location: view.php");
}
}
}



/*

NEW RECORD

*/
// if the 'id' variable is not set in the URL, we must be creating a new record
else
{
// if the form's submit button is clicked, we need to process the form
if (isset($_POST['submit']))
{
// get the form data
$naslov htmlentities($_POST['naslov'], ENT_QUOTES);
$sestavine htmlentities($_POST['sestavine'], ENT_QUOTES);
$priprava htmlentities($_POST['priprava'], ENT_QUOTES);

// check that firstname and lastname are both not empty
if ($naslov == '' || $sestavine == '' || $priprava == '')
{
// if they are empty, show an error message and display the form
$error 'NAPAKA: Podatke morate vnesti v vsa polja!';
renderForm($naziv$sestavine$priprava$error);
}
else
{
// insert the new record into the database
if ($stmt $mysqli->prepare("INSERT recepti (naslov, sestavine, priprava) VALUES (?, ?, ?)"))
{
$stmt->bind_param("sss"$naslov$sestavine$priprava);
$stmt->execute();
$stmt->close();
}
// show an error if the query has an error
else
{
echo 
"NAPAKA: Podatkov v bazi ne morem popraviti.";
}

// redirec the user
header("Location: view.php");
}

}
// if the form hasn't been submitted yet, show the form
else
{
renderForm();
}
}

// close the mysqli connection
$mysqli->close();
?>



2. Nema filtriranja, jer najverovatnije nije potrebno. U folderu je .htaccess, koji dozvoljava pristip samo jednom IP-ju

Joomlin objekt ne koristim, jer je ovo nije joomla (za sada) U stvari je samo jedna forma, u koji unosiš podatke, a kasnije jih možeš ispravit

Onebeat

Citat: erbi  u 25. Kolovoz 2017, 12:24
1. ovdje je cjeli kod:

<?php

[b]I.[/b]
EDIT RECORD

*/
// 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']))
{


[
b]II.[/b]
NEW 
RECORD

// insert the new record into the database
if ($stmt $mysqli->prepare("INSERT recepti (naslov, sestavine, priprava) VALUES (?, ?, ?)"))
{
$stmt->bind_param("sss"$naslov$sestavine$priprava);
$stmt->execute();
$stmt->close();
}
?>



2. Nema filtriranja, jer najverovatnije nije potrebno. U folderu je .htaccess, koji dozvoljava pristip samo jednom IP-ju


Pozdrav,

I. - zasto koristis višestruke if-ove kada sve može ići u jedan sa "i" (&&)
II. - greska koju ti ispisiva sama govori u čemu je problem ( u preparu imas 3x "naziva" naslov, sestavine, priprava i 3x upisa) a u bind parametrima imas 4x sss,naslov, sestavine, priprava

Što se tiče "nije potrebno", slazem se sa gazdom da MORAŠ uvijek čistit bez obzira sto dolazi sa jedne ip adrese, što ako uleti neki malware i krene punit sadržaj.

Postoji jedna dobra izreka koje se ja dosta držim kada su u pitanju ovakvi slučajevi:

Zamisli korisnika koji ništa ne zna i stavi njegovo neznanje na N-tu, tako treba razmišljat/gledat krajnjeg korisnika.

Truth will set you free

erbi

#4
Evo, sam sredio, hvala na pomoči.

Višestruki IF je zato, što sam skinuo skriptu sa: https://www.killersites.com/community/index.php?/topic/3064-basic-php-system-view-edit-add-delete-records-with-mysqli/
i jo samo editirao. Nešto sam pobrkao, a sad radi
Možda još koji link za ovaj filter?