Синтаксис SQL: передача переменной в запрос SQL - PullRequest
0 голосов
/ 07 декабря 2010

Это моя первая программа, и я провел обширные исследования, пытаясь ответить на этот вопрос, и я не могу решить проблему:

<?php

    include "connect.php";

    if (!$connection)
      {
      die('Could not connect: ' . mysql_error());
      }

    $submit = $_POST["submit"];

    if ($submit=="Submit") {
      $date = $_POST["date"];
      $name = $_POST["name"];
      $activity = $_POST["activity"];
      $activity_level = $_POST["activity_level"];

    $find_role = ("SELECT sales_role 
                     FROM role 
                LEFT JOIN USER on user.role_id = role.id 
                    WHERE user.user = '$name'");
    $find_activity_points = ("SELECT $activity_$role 
                                FROM $activity 
                               WHERE activity_level = '$activity_level'"); 

    $role = mysql_query($find_role);

    $activity_points = mysql_query($find_activity_points);
     if ($activity_points !== false) {
     }
      else {
       echo mysql_error ();
       die;
     }

     $convert_activity_points = array();

    while ($row = mysql_fetch_array($activity_points, MYSQL_ASSOC)) {
      $convert_activity_points[] = $row;
     }



    $set_points = "UPDATE $name SET $activity='$convert_activity_points' WHERE day='$date'";
     mysql_query($set_points);


    } 

    mysql_close($connection);

    ?>

И это сообщение об ошибке, которое я получаю, когда отправляю form.php в update.php: У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с «ОТ набора» WHERE activity_level = «70» в строке 1

P.S. Я знаю, что существуют уязвимости в SQL-инъекциях, но я единственный человек, использующий эту программу, и использую ее локально на своем компьютере. Сейчас я в порядке с уязвимостями.

Редактировать: измененный код (я очень ценю обратную связь)

$find_role = "SELECT sales_role FROM role LEFT JOIN USER on user.role_id=role.id WHERE user.user='$name'";

$find_activity_points = "SELECT %s_%s FROM $activity WHERE activity_level='%d'";    

list($role) = mysql_fetch_array(mysql_query($find_role));

 $activity_points = mysql_query(
     sprintf($find_activity_points, //the main string
         $activity, $role, $activity, $activity_level) //the "arguments"
  );    

    if ($activity_points !== false) {
    }
        else {
            echo mysql_error ();
            die;
    }

Обновляет таблицу с 0 и не отображает сообщение об ошибке. Об уязвимостях SQL-инъекций, см. Мое оригинальное утверждение PS

Ответы [ 4 ]

1 голос
/ 07 декабря 2010

На этой строке:

$find_activity_points = ("SELECT $activity_$role FROM $activity WHERE activity_level='$activity_level'"); 

Я не вижу нигде в вашем коде, что вы определяете значение $role до выполнения запроса.

Итак, предположим, что $activity == 'Eating' ваше SELECT утверждение может выглядеть примерно так:

SELECT Eating_$role FROM Eating WHERE activity_level='...'

Это может привести к вашей ошибке, поскольку я считаю, что MySQL не допускает $ символов в именах таблиц / столбцов.

Как и Babiker , вы можете объединить или использовать sprintf (), чтобы решить некоторые из этих различных проблем.


Редактировать: Отвечая на ваш вопрос в комментариях.

Как уже упоминали другие, замените строку $find_activity_points на что-то похожее на следующее:

$find_activity_points = ("SELECT " . $activity . "_" . $role . " FROM " . $activity . " WHERE activity_level='" . $activity_level . "'");

Следует помнить одну вещь: когда вы делаете конкатенацию операторов SQL («SELECT». $ Activity. »), Как в моем примере, вы открываете себе SQL-инъекцию атак.

0 голосов
/ 07 декабря 2010

На первый взгляд, я думаю, что тип данных «Maybe» Activity_level - это не строка, а число. Так что вам не нужно помещать '...' в WHERE activity_level = '$ activity_level'

Edit: чтобы быть уверенным в том, что вызывает проблемы, я рекомендую logging , как пример здесь . Просто включите класс и зарегистрируйте свой запрос в файле (очень просто), а затем изучите сам запрос.

0 голосов
/ 07 декабря 2010

$ role не определено в вашей программе до позднего времени, и даже в этом случае это нескалярное значение, которое также разрушит ваш запрос. Вы пытаетесь использовать переменные, прежде чем они имеют значения. Они не работают таким образом, как только эта строка установлена, она будет содержать значения этих переменных на момент ее объявления.

Вы, вероятно, хотите использовать sprintf. http://php.net/manual/en/function.sprintf.php

  $find_activity_points = "SELECT %s_%s FROM %s WHERE activity_level='%d'"; 

А потом

  $activity_points = mysql_query(
     sprintf($find_activity_points, //the main string
         $activity, $role, $activity, $activity_level) //the "arguments"
  );

Конечно, вам все равно нужно получить $role в качестве (скалярного) значения, которое может быть правильно обработано в строке. Один (несколько небезопасный, но быстрый) способ сделать это:

  list($role) = mysql_fetch_array(mysql_query($find_role));
0 голосов
/ 07 декабря 2010

Конкатенация строк php в строки mysql, например:

mysql_query("SELECT * FROM `someTable` WHERE `someValue`='".$someVar'");
  • И $_POST["activity_level"] - это строка с '.

Решение:

"SELECT `".$activity_$role."` FROM `".$activity."` WHERE `activity_level`='".mysql_real_escape_string($activity_level)."'"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...