Я попытался сделать несколько постов об этой проблеме, но решил собрать все в этом финальном, чтобы, надеюсь, как-то ее решить.
Я создаю сайт, на котором пользователи могут голосовать по вопросам из базы данных. Логин отсутствует, поэтому, чтобы убедиться, что каждый может проголосовать только один раз за вопрос, я использую их IP вместе с идентификатором вопроса.
Во-первых, я получаю идентификатор и IP-адрес и сохраняю их, убедившись, что они являются целыми числами:
if(isset($_GET['id']))
{
//Get IP address
//Test if it is a shared client
if (!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];
//Is it a proxy address
}elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip=$_SERVER['REMOTE_ADDR'];
}
//Save id and IP address as variables
$id = $_GET['id'];
$ip_long = ip2long($ip);
Затем я проверяю, проголосовал ли уже пользователь, используя две переменные. Вот где я ожидаю, что проблема возникает. я получаю:
Примечание: попытка получить свойство не-объекта
из строки 116, а именно: $row_cnt = $result->num_rows
.
Кроме того, var_dump ($result)
возвращает bool(false)
, а var_dump ($row_cnt)
возвращает Null
. Добавление кавычек вокруг двух переменных в запросе, $ip_long и $id, устраняет проблему на локальном хосте, но не на моем сервере.
Локальный var_dump($result)
с кавычками вокруг переменных возвращает следующее:
object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(1) ["length"]=> NULL ["num_rows"]=> int(1 ) ["тип"]=> целое(0) }
Я хотел бы добавить 1 к QuestionVotes для конкретного вопроса, а затем удалить возможность голосовать по тому же вопросу для определенного IP-адреса.
//Save id and IP address as variables
$id = $_GET['id'];
$ip_long = ip2long($ip);
///Check to see if user already voted
$stmt = $conn->prepare("SELECT * FROM User_Votes where UserID = ? and QuestionID = ?");
mysqli_stmt_bind_param($stmt, 'ss', $ip_long, $id);
$stmt->execute();
$result = $stmt->get_result();
if($result->num_rows){
//The user has already voted
echo "Already voted";
}else{
//Add IP Address and ID to the User_Votes table
$stmt = $conn->prepare("INSERT INTO User_Votes (UserID, QuestionID) VALUES (?, ?)");
mysqli_stmt_bind_param($stmt, 'ss', $ip_long, $id);
$stmt->execute();
$stmt = $conn->prepare("UPDATE Question SET QuestionVotes = QuestionVotes + 1 where QuestionID = ?");
mysqli_stmt_bind_param($stmt, 's', $id);
$stmt->execute();
}
}
И, наконец, вот код, который я использую для создания html-полей, содержащих информацию о вопросе базы данных, добавляю кнопку голосования, которая отображает текущие голоса, и добавляю то, что используется как QuestionID, к URL-адресу:
// Build 4 question boxes from database Question table, including voting button
$stmt = $conn->prepare("SELECT * FROM question ORDER BY QuestionVotes DESC LIMIT 4");
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
//$row["QuestionID"] to add id to url
echo "<div class=\"col-md-3\"><h2>". $row["QuestionHeader"]. "</h2><p>". $row["QuestionText"]. "</p><p><a href=\"index.php?id=". $row["QuestionID"]. "\" class=\"btn btn-success\"> " . $row["QuestionVotes"] . "</a></p></div>";
}
}
else
{
echo "0 results";
}
Мои таблицы выглядят следующим образом:
Вопрос: QuestionID(int11)(pk), QuestionHeader(varchar(20)), QuestionText(text), QuestionVotes(int(5))
User_Votes: UserID (без знака, целое (39)), QuestionID (целое (11))
$id = $_GET['id'];
, за которым следует$conn->query("SELECT ... QuestionID = $id");
). Если я отправлю1; DELETE * FROM question
в качестве значения дляid
, вы не будете счастливы. - person jcaron   schedule 09.12.2015false
, что означает ошибку. Проверьте значение$result
перед его использованием. Еслиfalse
, запишите ошибку ($conn->error
). - person jcaron   schedule 09.12.2015$result
ложно. И я уже знаю, что$result
было ложным, я говорил вам проверить это в своем коде и использовать$result
только в том случае, если оно не ложно. - person jcaron   schedule 09.12.2015