2014-10-13 3 views
2

Я хочу иметь систему, в которой пользователи могут перейти на страницу, где есть список элементов, которые они могут оценивать (например, от 1 до 5) из раскрывающегося списка. Этот список будет довольно длинным, поэтому было бы гораздо удобнее, если бы они могли пройти и ранжировать каждый элемент, не нажимая «Сохранить».ColdFusion и AJAX - Обновление базы данных

Я очень много новичка, когда речь идет о AJAX, но я полагаю, что это не может быть что трудно. Я нашел an answer in a different discussion, что я считаю весьма актуальным, но он не дает достаточной информации для того, чтобы я точно знал, что с ним делать.

Вкратце, как использовать AJAX в соответствии с jQuery и ColdFusion, чтобы обновить базу данных без необходимости в кнопке сохранения/отправки?

РАЗРЕШЕНИЕ: Я должен был уточнить, что пользователь может оценить предметы - не ранг. Это означает, что нет # 1, # 2, # 3 и т. Д. Вместо этого каждый элемент можно оценивать по шкале от 1 до 5.

В настоящее время я основываю все на «.change()», когда пользователь делает выбор в раскрывающемся списке. В какой момент у меня есть две переменные jQuery, которые установлены в «Идентификатор» измененного элемента, а также его новый «рейтинг». Мне просто нужно найти способ использовать эти две переменные для обновления таблицы в базе данных.

Update На главной странице, теперь у меня есть простой JQuery AJAX пост вызова: $.post('update.cfc', {ID: inputID, rating: selRat}), который срабатывает .onChange(). «inputID» - это идентификатор записи, которую я хочу обновить в базе данных, а «selRat» - выбранный рейтинг в раскрывающемся списке.

<cfcomponent output="false"> 
<cffunction name="updateRating" access="remote" output="false"> 

    <cfupdate datasource="#session.db#" name="update"> 
     UPDATE ajaxTest 
     SET rating = #FORM.rating# 
     WHERE ID = #FORM.ID# 
    </cfupdate> 

</cffunction> 
</cfcomponent> 

В настоящее время я получаю 500 (Internal Server Error).

Мысли/предложения?

+0

Вам нужна кнопка, чтобы изменить ранжирование параметров, не так ли? Возможно, это пара, которая позволяет вам перемещать опцию вверх или вниз по списку.Используйте событие click на этих кнопках для запуска сохранения. Тем не менее, вы рискуете несколькими кликами, чтобы переместить элемент вверх/вниз более чем один слот, переписывающий друг друга. Возможно, вам будет лучше с кнопкой сохранения, которую нужно щелкнуть после того, как они внесут изменения. –

+2

Вы на правильном пути. Посмотрите учебник о том, как использовать функции jjery ajax с холодным синтезом. Вернитесь и задайте конкретный вопрос, если вы действительно застряли. –

+0

@ ClaytonLeis: Спасибо за поддержку! Я обнаружил, что вы можете получить доступ к переменным, которые были переданы через AJAX в ColdFusion, просто используя # Form.variable #, которые помогли, я думаю. Я обновил сообщение с дополнительной информацией. Я не против получать подсказки вместо прямых ответов, если вы предпочтете это. Помогает учиться! Еще раз спасибо. – Steve

ответ

3

Вы пробовали представить традиционный способ этой формы, чтобы узнать, что происходит? Вы также можете добавить некоторую простую отладку, например запись в файл, чтобы зарегистрировать выполненную попытку?

Одна вещь, которая выделяется для меня: Если <cfupdate открытия и закрытия тега быть <cfquery я не использую cfupdate или cfinsert, но я не думаю, что сравни вкус поддерживает синтаксис, который вы пытаетесь использовать, что заставляет меня поверить, что это простая ошибка.

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

Если я представил «0; DROP TABLE пользователей» для значения ID, ваша таблица пользователей исчезает (если у вас есть таблица пользователей). Я мог бы также передавать другие общие имена таблиц, такие как Members, News, Pages, Content, CMS, Transactions. (Я бы этого не сделал, но вы никогда не знаете, когда может быть другой пользователь.)

Существует очень простое решение, <cfqueryparam>. Я дам вам исследование тега, но я покажу вам, как изменить этот конкретный запрос.

<cfquery datasource="#session.db#" name="update"> 
    UPDATE ajaxTest 
    SET rating = <cfqueryparam cfsqltype="cf_sql_integer" value="#form.rating#"> 
    WHERE ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#form.id#"> 
</cfquery> 

CFQUERYPARAMing переменные останавливает риск этого и передает значения переменных в виде текста, а не SQL.

+0

О, вау ... Я не могу поверить, что совершил эту ошибку (cfupdate вместо cfquery)! Кроме того, спасибо за отзыв на cfqueryparam, cfqueryparap (соответствующее имя пользователя). Это был всего лишь тестовый сайт и база данных, но мне нужно привыкнуть делать это всегда. Ошибка «cfupdate» была, безусловно, первоначальной проблемой. Теперь я получаю сообщение POST (302 Moved Temporarily) и GET error (403 Forbidden). Итак, опять-таки, что-то глупое с моей стороны, я уверен. – Steve

+1

@Steve, где находится эта страница .cfc? Для тестирования поместите его в папку со своим собственным пустым application.cfc и вручную заполните # session.db # в вашей cfquery. как mysite.com/noapp/update.cfc. Используйте это, чтобы начать просто и учиться. Вы также можете сделать эту функцию как-то вроде сообщения об ошибках. Кроме того, не чувствуйте себя плохо по поводу отсутствия cfupdate, я просмотрел ваш вопрос как минимум 3 раза, прежде чем заметил это = P. Забавно, как это работает. Если бы отсутствовал #, мой мозг был бы нул в этом. Но это подчеркивает, почему это помогает подавать традиционно, CF сказал бы вам прекратить «да! :) –

+0

Если cfupdate решил указанную проблему, отметьте ее как ответ и перейдите. Если у вас возникли следующие проблемы, задайте им новый вопрос. –