MySQL sözdizimi: Eğer SQL sözdizimi bir hata var

4 Cevap php

Ben çok basit bir fonksiyon yazdım:

function editCategory() {
    $ID         = urlencode($_GET['id']);
    $cname   = mysql_fix_string($_POST['cname']);
    $kabst   = mysql_fix_string($_POST['kabst']);
    $kselect    = $_POST['kselect'];
    $subsl      = $_POST['subsl'];
    $kradio     = $_POST['kradio'];
    $ksubmit    = $_POST['ksubmit'];

    if (isset($ksubmit)) {
        $query = "UPDATE category SET name = '$cname', description = '$kabst', published = '$kselect',  home = '$kradio', subcat = '$subsl'  WHERE id = $ID ";

        $result = mysql_query($query);
        if (mysql_affected_rows () == 1) {
            echo "ok";
        }
        else{
            echo mysql_error();
        }
    }
}

function mysql_fix_string($string)
{
    if (get_magic_quotes_gpc())
        $string = stripslashes(($string));
    return mysql_real_escape_string($string);
}

Hata:

Eğer SQL sözdizimi bir hata var; line 1 yakın'' kullanmak için doğru sözdizimi için MySQL sunucu sürümü karşılık kılavuzunu kontrol

Yanlış olan nedir?

4 Cevap

Burada sadece bir id geçmek için nasıl göstermek için çok basit bir CRU D uygulama, bir örnektir:

<?
mysql_connect();
mysql_select_db("new");
$table="test";
if($_SERVER['REQUEST_METHOD']=='POST') { //form handler part:
  $name = mysql_real_escape_string($_POST['name']);
  if ($id=intval($_POST['id'])) {
    $query="UPDATE $table SET name='$name' WHERE id=$id";
  } else {
    $query="INSERT INTO $table SET name='$name'";
  }
  mysql_query($query) or trigger_error(mysql_error()." in ".$query);
  header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);
  exit;
}
if (!isset($_GET['id'])) { //listing part:
  $LIST=array();
  $query="SELECT * FROM $table";
  $res=mysql_query($query);
  while($row=mysql_fetch_assoc($res)) $LIST[]=$row;
  include 'list.php';
} else { // form displaying part:

  if ($id=intval($_GET['id'])) {
    $query="SELECT * FROM $table WHERE id=$id";
    $res=mysql_query($query);
    $row=mysql_fetch_assoc($res);
    foreach ($row as $k => $v) $row[$k]=htmlspecialchars($v);
  } else {
    $row['name']='';
    $row['id']=0;
  }
  include 'form.php';
}
?>

Form.php Dosya:

<form method="POST">
<input type="text" name="name" value="<?=$row['name']?>"><br>
<input type="hidden" name="id" value="<?=$row['id']?>">
<input type="submit"><br>
<a href="?">Return to the list</a>
</form>

List.php Dosya:

<a href="?id=0">Add item</a>
<? foreach ($LIST as $row): ?>
<li><a href="?id=<?=$row['id']?>"><?=$row['name']?></a>
<? endforeach ?>
$ID         = intval($_GET['id']); //using urlencode here is weird
$cname      =  mysql_real_escape_string($_POST['cname']); 
//and the same for the rest ALL.
$kradio     = mysql_real_escape_string($_POST['kradio']); 

Ayrıca,

$ksubmit    = $_POST['ksubmit']; 
if (isset($ksubmit)) { 

is senseless. $ksubmit would be always set it should be

if (isset($_POST['ksubmit'])) { 

Eğer tüm değişkenleri olduğundan emin olmak için, yazısının üstündeki şu satırları ekleyin lütfen:

ini_set('display_errors',1);
error_reporting(E_ALL);

Sen emin olmak gerekir:

  • For fields that are strings (varchar/char) in the DB :
    • Eğer geçen konum değerleri düzgün tırnak içine alınır
    • Eğer geçen konum değerlerinin içeriği kaçtı olmalıdır: kullanıcı POSTed ne bir alıntı varsa, o kaçtı gerekir - bkz mysql_real_escape_string
  • For fields that are integers in the DB :
    • Sen tamsayı değerler geçmelidir
    • intval kullanıcı tarafından POSTed değerler arayarak sağlanabilir hangi


Here, you should probably :

  • intval() kullanmak $_GET['id']
  • Use mysql_real_escape_string on some other fields.
    • (0 [{hariç -, sorgudan bakılırsa tüm alanları, id tek tırnak içine olan ben, dışında tüm alanları üzerinde mysql_real_escape_string kullanmak zorunda söyleyebilirim ki )]}, tabii.


As a sidenote :

  • Sen $_GET id için kullanıyor
  • Ve $_POST her şey için.

Bu amaçla açık mı?

Boş bir değişken gibi geliyor.

Ve SQL enjeksiyon karşı bir şey yapmak, herkes sizin veritabanı kesmek olabilir. Biraz şans ile, sorguları içine tüm kullanıcı girişi için mysql_real_escape_string () kullanın ... sizin veritabanı öldürme sensin.