PHP-запрос SQL не возвращает результат - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть кнопка в веб-приложении, которая позволяет пользователям запрашивать специально отформатированный номер.Когда пользователь нажимает эту кнопку, запускаются 2 сценария.Первый, который полностью функционален, просматривает таблицу чисел, находит наибольшее число и увеличивает его на 1. (Это не первичный ключ), второй частично работающий скрипт получает текущую дату и выполняет запрос SQL, чтобы узнать, какой периодэта дата входит в число. (Периоды в этом случае не всегда равны полному месяцу). Я знаю, что этот скрипт по крайней мере частично работает, потому что я могу получить доступ к переменной $ datetoday, вызываемой в этом файле сценария.Однако он не возвращает запрошенные данные из таблицы периодов.Кто-нибудь, кто может помочь мне определить, что я делаю неправильно?

<?php
    include 'dbh.inc.php';
    $datetoday = date("Ymd");
    $sql = "SELECT p_num FROM periods where '$datetoday' BETWEEN p_start AND p_end";
    $stmt = mysqli_stmt_init($conn);
    if(!mysqli_stmt_prepare($stmt, $sql)) {
        header("Location: ../quote.php?quotes=failed_to_write");
        exit();
    } else {
        mysqli_stmt_execute($stmt);
        mysqli_stmt_store_result($stmt);
        $result = mysqli_stmt_get_result($stmt);
        $row = mysqli_fetch_assoc($result);
        $pnum = $row;
        mysqli_stmt_close($stmt);
    }

Если это поможет кому-нибудь, я опубликовал свой код на https://github.com/cwilson-vts/Quote-Appliction

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Я думаю, я знаю, что я делал неправильно, кто-то с большим количеством умных PHP, чем я, должен сказать наверняка.В приведенном выше коде я использовал mysqli_stmt_store_result. Я считаю, что он очищал мою переменную до того, как планировал.Я изменил это и переработал свой запрос, чтобы он был более простым.

    <?php
include 'dbh.inc.php';
$datetoday = date("Ymd");
$sql = "SELECT p_num FROM periods WHERE p_start <= $datetoday order by p_num desc limit 1";
$stmt = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmt, $sql)) {
    header("Location: ../quote.php?quotes=failed_to_write");
    exit();
} else {
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    while( $row = mysqli_fetch_assoc($result)) {
    $pnum = $row['p_num'];
    echo $pnum;
    }
    mysqli_stmt_close($stmt);
}

Спасибо @rhuntington и @nick за попытку помочь.Извините, я такой идиот.

0 голосов
/ 01 октября 2018

Итак, во-первых, я не использую msqli и никогда не изучал его.Тем не менее, я считаю, что я понимаю суть того, что вы хотите сделать.Я использую PDO, потому что ЧУВСТВУЮ, что его легче использовать, легче читать, и это также то, чему я научился, начиная с.Это как Apple против Samsung ... ни один продукт не является абсолютно неправильным или правильным.И у каждого есть свои преимущества и недостатки.То, что я собираюсь предоставить вам, будет в форме PDO, поэтому я надеюсь, что вы сможете использовать это.И если вы не можете, то не беспокойтесь.

Сначала я хочу рассмотреть одну важную вещь, которую я видел, - это то, что вы вставляете переменные непосредственно в оператор mysql.Это не считается стандартной практикой и небезопасно из-за инъекций sql.Для справки я хотел бы, чтобы вы прочитали эти сайты:

http://php.net/manual/en/security.database.sql-injection.php

http://php.net/manual/en/pdo.prepared-statements.php

Далее я вас замечаю »используется datetime в качестве имени переменной.Я советую против этого, поскольку это зарезервировано в большинстве языков программирования и может быть хитрым.Поэтому вместо этого я собираюсь изменить его на что-то, что не будет чувствительным к нему, например $now = "hello world data";

Кроме того, я не вижу, где вы напечатаете результат?Или ты просто не включил это?Еще одна вещь для рассмотрения: ваша переменная даты и времени имеет тот же формат, что и то, что вы храните в своей БД?Потому что, если нет, вы будете возвращать 0 результатов каждый раз.Также убедитесь, что это правильный часовой пояс.Потому что это действительно будет с тобой.И я покажу вам это в приведенном ниже коде.

Итак, теперь перейдем к реальному коду!Я предоставлю вам все, от кода подключения к базе данных до выполнения sql.

ФАЙЛ ПОДКЛЮЧЕНИЯ БД:

<?php

    $host = '127.0.0.1';
    $user = 'root';
    $pw = '';
    $db = 'test'; // your db name here (replace 'test' with whatever your db name is)

    try {
        // this is the variable will call on later in the main file
        $conn = new PDO("mysql:host=$host;dbname=$db;", $user, $pw);
    } catch (PDOException $e) {
        // kills the page and returns mysql error
        die("Connection failed: " . $e->getMessage());
    }
?>

Файл данных:

<?php
    // calls on the db connection file
    require 'dbconfig.php';

    // set default date (can be whatever you need compared to your web server's timezone). For this example we will assume the web server is operating on EST.
    date_default_timezone('US/Eastern');
    $now = date("Ymd");

    // check that the $now var is set
    if(isset($now)) {
        $query = $conn->prepare("SELECT p_num FROM periods WHERE p_start BETWEEN p_start AND :now AND p_end BETWEEN p_end AND :now");
        $query->bindValue(':now', $now);
        if($query->execute()) {
            $data = $query->fetchAll(PDO::FETCH_ASSOC);
            print_r($data); // checking that data is successfully being retrieved (only a troubleshooting method...you would remove this once you confirm it works)
        } else {
            // redirect as needed and print a user message
            die("Something went wrong!");
        }
        $query->closeCursor();
    }
?>

ДругойЯ хочу упомянуть, что вы должны следить за соблюдением надлежащей процедуры устранения неполадок.Если это не работает, и я не получаю никаких ошибок, я обычно сначала начинаю с уровня запросов.Я проверяю, чтобы убедиться, что мой запрос выполняется правильно.Для этого я захожу в свою базу данных и выполняю ее вручную.Если это работает, то я хочу проверить, действительно ли я получаю значение для переменной, которую я объявляю.Как видите, я проверяю, установлена ​​ли переменная $now.Если это не так, этот блок кода даже не запустится.PHP может быть довольно хитрым и привередливым по этому поводу, поэтому убедитесь, что вы проверите это.Если вы не уверены, какая переменная также устанавливается, введите или напечатайте ее, просто набрав echo $now

Если у вас есть дополнительные вопросы, пожалуйста, дайте мне знать.Я надеюсь, что это поможет вам!

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