php
  • mysql
  • mysqli
  • 2016-03-10 1 views -3 likes 
    -3

    Я искал ответ, но не мог найти его, поскольку проблема здесь немного отличается.

    $vid = $_SESSION['ID_Vendor']; 
    echo "ID: $vid"; 
    $q = 'SELECT business_name, vd.ID_Vendor, res.ID_RestaurantEstablishment 
        FROM restaurant res 
        INNER JOIN vendor_data vd 
        ON vd.ID_Vendor=res.ID_Vendor AND res.ID_Vendor="$vid" ORDER BY business_name ASC'; 
    

    переменный $ VID действительно имеет значение (равное 2, в данном случае, но она может быть разной), ОДНАКО, когда я специально установлен

    WHERE res.ID_Vendor=2 
    

    мой запрос возвращает правильный и ожидаемые список значений, но когда, вместо этого, я использую

    WHERE res.ID_Vendor="$vid" 
    

    с «$ VID», эхо моих значений просто пусто.

    Ниже приведен полный фрагмент кода, также отображающий выход. Спасибо за помощь.

    $vid = $_SESSION['ID_Vendor']; 
    echo "ID: $vid"; 
    $q = 'SELECT business_name, vd.ID_Vendor, res.ID_RestaurantEstablishment 
        FROM restaurant res 
        INNER JOIN vendor_data vd 
        ON vd.ID_Vendor=sfe.ID_Vendor AND res.ID_Vendor="$vid" ORDER BY business_name ASC'; 
    $r = mysqli_query($connection, $q); 
    while ($row = mysqli_fetch_array ($r, MYSQLI_NUM)) { 
    
        echo '>' . htmlspecialchars($row[0]) . ' ' . htmlspecialchars($row[1]) . ' ' . htmlspecialchars($row[2]) .'</option>'; 
    } 
    
    +0

    Разве это имеет значение? '$ д = "SELECT BUSINESS_NAME, vd.ID_Vendor, res.ID_RestaurantEstablishment от ресторана Рез INNER JOIN vendor_data Vd ON vd.ID_Vendor = res.ID_Vendor И res.ID_Vendor = $ við ORDER BY BUSINESS_NAME ASC";' – blazerunner44

    +2

    Повторите свой запрос перед тем, как выполнить его, и я думаю, что проблема станет очевидной. Вы можете полностью устранить проблему, если будете читать подготовленные заявления. –

    +0

    Дарвин, спасибо. Но почему бы подготовленное заявление изменить ситуацию? Я бы подумал, что вместо этого будет работать хранимая процедура, не так ли? Позвольте мне попробовать оба. –

    ответ

    0

    Поскольку я поднял идею, я полагаю, я должен проиллюстрировать использование подготовленных утверждений.

    Использование mysqli один будет действовать следующим образом (при условии, $connection был успешно инициализирован):

    // The indentation here is purely a matter of personal preference 
    $query = 'SELECT business_name, vd.ID_Vendor, res.ID_RestaurantEstablishment 
          FROM restaurant res 
          INNER JOIN vendor_data vd 
           ON vd.ID_Vendor = res.ID_Vendor 
          WHERE res.ID_Vendor = ? 
          ORDER BY business_name ASC'; 
    
    $stmt = $connection->prepare($query); 
    $stmt->bind_param('s', $vid); // 's' assumes $vid is string; use 'i' for int 
    $stmt->execute(); 
    $res = $stmt->get_result(); 
    while ($row = $res->fetch_array(MYSQLI_NUM)) 
    { 
        echo '>' . htmlspecialchars($row[0]) . ' ' . htmlspecialchars($row[1]) . ' ' . htmlspecialchars($row[2]) .'</option>'; 
    } 
    

    идиома такая же, используя PDO. Формат PDO data source name (DSN) документирован онлайн.

    $conn = new PDO($dsn, $username, $password); // define these vars elsewhere 
    $query = 'SELECT business_name, vd.ID_Vendor, res.ID_RestaurantEstablishment 
          FROM restaurant res 
          INNER JOIN vendor_data vd 
           ON vd.ID_Vendor = res.ID_Vendor 
          WHERE res.ID_Vendor = :vid 
          ORDER BY business_name ASC'; 
    $stmt = $conn->prepare($query); 
    $stmt->execute(array(':vid' => $vid)); 
    while ($row = $stmt->fetch(PDO::FETCH_NUM)) 
    { 
        echo '>' . htmlspecialchars($row[0]) . ' ' . htmlspecialchars($row[1]) . ' ' . htmlspecialchars($row[2]) .'</option>'; 
    } 
    

    В обоих случаях я оставляю обработку ошибок как упражнение для читателя.

    2

    PHP не признает переменную в паре апострофов ''. Поместите свою переменную в "". EG:

    "WHERE res.ID_Vendor='$vid'" 
    
    +0

    Спасибо @ThangTD и Luweiq, ваше решение решило проблему. Я все еще хочу попробовать подготовленные заявления, предложенные Дарвином, поскольку они даже улучшают безопасность. –

    0

    Там же несколько проблем с вашим кодом:


    Во-первых, это не будет работать, и будет эхо $vid буквально.

    echo "ID: $vid"; 
    

    Это вернет: ID: $vid

    Вам нужно Concat строку с переменной, она должна быть:

    echo "ID: " . $vid; 
    

    Это вернет: ID: 2


    Во-вторых, ваш запрос не будет работать:

    $q = 'SELECT business_name, vd.ID_Vendor, res.ID_RestaurantEstablishment 
        FROM restaurant res 
        INNER JOIN vendor_data vd 
        ON vd.ID_Vendor=res.ID_Vendor AND res.ID_Vendor="$vid" ORDER BY business_name ASC'; 
    

    Вы должны заключить запрос в двойных кавычках и переменный с одинарными кавычками вместо:

    $q = "SELECT business_name, vd.ID_Vendor, res.ID_RestaurantEstablishment 
        FROM restaurant res 
        INNER JOIN vendor_data vd 
        ON vd.ID_Vendor=res.ID_Vendor AND res.ID_Vendor='$vid' ORDER BY business_name ASC"; 
    
    0

    Для SQL, не нравится Javascript или PHP, только апостроф разрешен для строки или символа.

    Для MySQL, если тип столбца res.id_vendor является номером, res.id_vendor = '1' совпадает с res.id_vendor = 1, поэтому лучше всегда обертывать переменную одинарной цитатой, как в res.id_vendor = «$ VID»

    Наконец, комментарии по кодированию конвенции: рекомендуется не смешивать прописные и строчные символы в столбце наименовании, используйте «_» как разделители слов, как

    vd.id_vendor 
    res.id_restaurant_establishment 
    
    Смежные вопросы