Синтаксис MySQL: в вашем синтаксисе SQL есть ошибка - PullRequest
0 голосов
/ 03 апреля 2010

Я написал очень простую функцию:

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);
}

Ошибка:

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '' в строке 1

Что не так?

Ответы [ 4 ]

6 голосов
/ 03 апреля 2010
$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']); 

Также

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

бессмысленно. $ ksubmit будет всегда установлен должно быть

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

Чтобы убедиться, что у вас есть все переменные, пожалуйста, добавьте эти строки в верхней части скрипта:

ini_set('display_errors',1);
error_reporting(E_ALL);
1 голос
/ 03 апреля 2010

Вы должны убедиться, что:

  • Для полей, которые являются строками (varchar / char) в БД:
    • значения, которые вы передаете, правильно заключены в кавычки
    • содержимое значений, которые вы передаете, должно быть экранировано: если в сообщении, указанном пользователем, есть кавычка, его необходимо экранировать - см. mysql_real_escape_string
  • Для полей, которые являются целыми числами в БД:
    • Вы должны передать целочисленные значения
    • , что можно обеспечить, вызвав intval на значения, заданные пользователем


Здесь вы, вероятно, должны:

  • Использовать intval() на $_GET['id']
  • Используйте mysql_real_escape_string в некоторых других полях.
    • Исходя из запроса, в котором все поля, кроме id заключены в одинарные кавычки, я бы сказал, что вы должны использовать mysql_real_escape_string на всех полях - кроме, конечно, id.


В качестве обозначения:

  • Вы используете $_GET для id
  • и $_POST для всего остального.

Это специально?

0 голосов
/ 03 апреля 2010

Вот пример очень простого приложения CRU D , просто чтобы показать, как передать идентификатор:

<?
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:

<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:

<a href="?id=0">Add item</a>
<? foreach ($LIST as $row): ?>
<li><a href="?id=<?=$row['id']?>"><?=$row['name']?></a>
<? endforeach ?>
0 голосов
/ 03 апреля 2010

Звучит как пустая переменная.

И сделайте что-нибудь против внедрения SQL, каждый может взломать вашу базу данных. Если вам повезет, вы уничтожите свою базу данных ... Используйте mysql_real_escape_string () для всех пользовательских вводов в ваши запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...