【问题标题】:HTML: Submit star rating into my SQL databaseHTML:将星级评分提交到我的 SQL 数据库
【发布时间】:2020-04-14 20:41:35
【问题描述】:

我目前有一个有效的评论表单,用户可以在其中撰写关于酒店的评论。到目前为止,它包含一个标题和正文,但我现在希望实现一个星级评级,以便用户选择一个评级并将其提交到我的数据库。我目前有用户可以提交标题和正文的代码,但是星级评分没有提交,也没有提交到我的数据库。谁能给点建议?

ReviewController.php

    public function store(Request $request)
{
    $this->validate($request, [
        'title' => 'required' ,
        'body' => 'required' ,
        'post_id' => 'required'
    ]);

    $review = new Review;
    $review->title = $request->input('title');
    $review->body = $request->input('body');
    $review->rating = $request->input('rating');
    $review->post_id = $request['post_id'];
    $review->save();
    return redirect('/posts')->with('success', 'post created');
}

Show.blade.php

    <h1>Reviews</h1>
@if(count($review) > 1)
    @foreach($review as $reviews)
        <div class= "well"> 
            <h3><a href="/reviews/{{$reviews->title}}">{{$reviews->title}} </a>{{$reviews->rating}}</h3><small>{{$reviews->created_at}}</small><br>
            <small>{{$reviews->body}}</small> 
           <br>
           <br>
        </div>

        @endforeach

        @else
    </p>no posts found</p>
    @endif     
@endsection  

Javascript:

var count;
 function starmark(item)
{
  count=item.id[0];
  sessionStorage.starRating = count;
  var subid= item.id.substring(1);
    for(var i=0;i<5;i++)
      {
        if(i<count)
      {
    document.getElementById((i+1)+subid).style.color="orange";
      }
        else
      {
    document.getElementById((i+1)+subid).style.color="black";
    }
        }
            }

当我将它提交到我的数据库时,这些值显示为 NULL,但是我希望它们具有 1-5 的值。

【问题讨论】:

    标签: javascript php


    【解决方案1】:

    &lt;input&gt; 元素可以在表单中发送数据,&lt;span&gt; 元素不能。现在,您正在使用 JavaScript 中的函数通过尝试从悬停或单击的范围中获取值来模拟这种行为。 sessionStorage.starRating = count 应该是 sessionStorage.setItem('starRating', count) 以将值存储到会话存储中。但这不是罪魁祸首。

    不要使用&lt;span&gt; 元素,而是使用&lt;input type="radio"&gt; 元素来指示用户给出的评分。虽然样式可能看起来很困难,但使用&lt;label&gt; 元素作为样式点可以相当容易。当您将带有for 属性的&lt;label&gt; 连接到它所属的&lt;input&gt; 元素的ID 时,它就变成了可点击的。这意味着每当我点击标签时,输入也会被点击并因此被选中。

    所以你隐藏输入并设置标签的样式。在 CSS 中,您会根据当前选择的输入说明点击标签的外观。 :checked 伪选择器在这里是真正的救星。

    将所有这些放在您的表单中,使当前选定的单选按钮与正确的 namevalue 对一起发送到服务器,而无需执行任何 JavaScript。

    查看下面的 sn-p 以查看它的工作原理。 JavaScript 部分可以忽略,因为它只是一个演示。

    /**
     * For demonstration purposes.
     * Logs the currently submitted 'rating' value.
     */
    const form = document.querySelector('form');
    form.addEventListener('submit', event => {
      const formData = new FormData(event.target);
      const rating = formData.get('rating');
      console.log(rating);
      event.preventDefault();
    });
    .star-input {
      display: none;
    }
    
    .star {
      color: gold;
    }
    
    .star-input:checked + .star ~ .star {
      color: white;
    }
    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css">
    <form>
      <input type="radio" class="star-input" name="rating" id="star-1" value="1">
      <label for="star-1" class="star"><i class="fas fa-star"></i></label>
      <input type="radio" class="star-input" name="rating" id="star-2" value="2">
      <label for="star-2" class="star"><i class="fas fa-star"></i></label>
      <input type="radio" class="star-input" name="rating" id="star-3" value="3">
      <label for="star-3" class="star"><i class="fas fa-star"></i></label>
      <input type="radio" class="star-input" name="rating" id="star-4" value="4">
      <label for="star-4" class="star"><i class="fas fa-star"></i></label>
      <input type="radio" class="star-input" name="rating" id="star-5" value="5" checked>
      <label for="star-5" class="star"><i class="fas fa-star"></i></label>
      <button type="submit">Send</button>
    </form>

    【讨论】:

    • 不客气 :)。如果这是一个新问题,请将其作为新问题提交。这将有助于保持该线程的清洁,并且可能对其他有相同问题的人有所帮助。否则,如果它与我给出的答案有关,或者我留下了一些未回答的问题,那就开枪吧。
    • 我会两者都做,我只需要知道现在它存储在我的数据库中,我将如何将其输出为星号。在我的数据库中,它存储为 3 或 4 或 5(无论用户输入什么),我将如何将其输出为星号。现在我在 Show.blade.php 中有以下代码(更新)
    • 你可以看到它输出 {{$reviews ->ratings}} 但是我需要它作为星输出
    猜你喜欢
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    相关资源
    最近更新 更多