Используйте PHP+jQuery AJAX, чтобы проверить базу данных MySQL на изменения и загрузить изменения?

Вот метод расширения, который я использую, чтобы обойти это невероятно разочаровывающее решение. Смотрите примечания, лучший и наиболее эффективный способ справиться с этим - использовать конструктор ticks из DateTimeOffset вместо того, чтобы выделять другое промежуточное звено DateTime просто для изменения его свойства Kind.

    /// <summary>
    /// Converts a DateTime to a DateTimeOffset, without risking any onerous exceptions
    /// the framework quite unfortunately throws within the DateTimeOffset constructor, 
    /// such as they do when the source DateTime's Kind is not set to UTC. The best and 
    /// most performant way around this, which we do herein, is to simply construct the 
    /// new DateTimeOffset with the overload that excepts Ticks. Also, we will simply 
    /// return <see cref="DateTimeOffset.MinValue"/> if the source DateTime was 
    /// <see cref="DateTime.MinValue"/>.
    /// </summary>
    /// <param name="dt">Source DateTime.</param>
    /// <param name="offset">Offset</param>
    public static DateTimeOffset ToDateTimeOffset(this DateTime dt, TimeSpan offset)
    {
        // adding negative offset to a min-datetime will throw, this is a 
        // sufficient catch. Note however that a DateTime of just a few hours can still throw
        if (dt == DateTime.MinValue)
            return DateTimeOffset.MinValue;

        return new DateTimeOffset(dt.Ticks, offset);
    }

    public static DateTimeOffset ToDateTimeOffset(this DateTime dt, double offsetInHours = 0)
        => ToDateTimeOffset(dt, offsetInHours == 0 ? TimeSpan.Zero : TimeSpan.FromHours(offsetInHours));
7
задан Backus 12 December 2013 в 04:07
поделиться

2 ответа

Страница, которая должна обновляться в зависимости от содержимого базы данных, должна периодически опрашивать базу данных. Javascript - это клиентская технология, которая не предназначена для прямого взаимодействия с внутренними серверами.

JavaScript будет выглядеть так (с использованием jquery):


$.post("/webroot/checkForChanges.php", 
        { currentNumber: currNumString },
        function(dat){
            $(dat).find('link').each( function() {
                $('#linksTable').append(""+$(this).text()+"");
            });
});

Это сделает POST-запрос к странице, которую вы напишете (checkForChanges.php) с переменной с именем currentNumber, значение которой является строковым представлением количество ссылок, находящихся в настоящее время в таблице (считайте их, как хотите).

функция (dat) часть кода - это функция обратного вызова, которая запускается, когда запрос завершается (то есть когда страница php завершила обработку и полученный текст был принят в браузер).

Я вернусь к тому, что это делает, когда я объясню, что делает страница PHP.

Вы ничего не сказали нам о структуре своей базы данных, но, поскольку вы успешно разрешаете людям добавлять ссылки, вам необходимо где-то определить последовательность, которая отслеживает целочисленный идентификатор ссылки (чтобы можно было указать каждую ссылку уникальный идентификатор в базе данных). Я предполагаю, что вы назвали это «количество ссылок» Вы должны создать простую php-страницу со следующим псевдокодом:



//open a database connection
$DB = connect( name, user, password );

//receive value
$currNum = $_POST['currentNumber'];

//check to see if sequence number has incremented since last time:
$seqNum = query( "SELECT currval('links-count')" );

if ($seqNum == $currNum){
    exit(0);
}   //if they are the same, just exit the page without writing anything

//otherwise, carry on... get the result of your query (for new links)
//and loop through, echoing return data

$newEntries = query("SELECT url FROM links WHERE id > ".$currNum);

echo "<newlinks>";

while ( $result = fetch_result( $newEntries ) ) {
    echo "<link><a>".$result."</a></link>";
}

echo "</newlinks>";

Результатом, возвращаемым этой страницей, будет XML-документ с узлом для каждой ссылки, содержащей HTML-код, который вы хотите поместить в ячейку таблицы.

Теперь мы можем вернуться к функции обратного вызова в запросе $ .post в вашем клиентском java-коде:


function(dat){
    $(dat).find('link').each( function() {
          $('#linksTable').append(""+$(this).text()+"");
    });
});

dat - это возвращаемый текст, обернуть его как объект jquery, а затем найти коллекцию тегов с именем 'link'. для каждого тега 'link', возвращаемого php-страницей, выполнить функцию, которая добавляет новую строку таблицы в linksTable, которая содержит данные внутри тегов ссылок.

14
ответ дан 6 December 2019 в 15:25
поделиться

У вас может быть активный javascript на отдельной странице, который в основном опрашивает базу данных на предмет изменений, или вы можете использовать функцию обратного вызова, которая сделает это после успешной отправки. Я не совсем уверен, что здесь происходит, поэтому не знаю, что рекомендовать.

0
ответ дан 6 December 2019 в 15:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: