2015-03-09 3 views
1

Вот мой код:Невозможно вставить новую строку в базу данных

$q5 = "SELECT * FROM subjects WHERE name='$sn'"; 

$r5 = @mysqli_query($dbc, $q5); 

if($r5) { 


     $q3 = "UPDATE subjects SET grade='$grade' WHERE name='$sn'"; 

     $r3 = @mysqli_query($dbc, $q3); 

} else { 

     echo "false"; 
     //$q3 = "INSERT INTO subjects (name, grade) VALUES ('$sn', '$grade')"; 

     //$r3 = @mysqli_query($dbc, $q3); 

} 

create_subject_table($sn, $assignment, $assignment_max, $dbc); 

} 

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

+0

Я не знаю PHP достаточно хорошо, чтобы знать точно, но я ожидаю, что вам нужно сделать что-то вроде получения значения $ r5 и использовать его в качестве вашего условия. Также обратите внимание, что если $ sn - это то, что пользователь контролирует, у вас есть классический эксплойт SQL на ваших руках. (Вставьте обязательный мультфильм xkcd на таблицы bobby) – Foon

+0

Спасибо, я слышал о SQL-инъекциях, но я не очень хорошо знаком с ними. Я определенно проверю это, чтобы улучшить мою безопасность. – Max

ответ

1

Это потому, что mysqi_query вернет false, если запрос не выполняется для некоторых и объект/истина, если он преуспеет. В этом случае он вернет объект, в котором ничего нет.

Что вы хотите сделать вместо проверки на истину, вы хотите сделать что-то вроде:

if ($r5->num_rows > 0) 

вместо

if ($r5) 

как первый будет проходить только если вы на самом деле получить результат назад из БД, а не только, что запрос не выдал ошибку.

Со страницы док PHP для mysqi_query:

Возвращает FALSE при неудаче. Для успешных запросов SELECT, SHOW, DESCRIBE или ВОПРОСЫ EXPLAIN mysqli_query() вернет объект mysqli_result. Для других успешных запросов mysqli_query() вернет TRUE.

+0

Спасибо, что сработал – Max

+0

Рад, что это помогло. Не стесняйтесь принять мое решение, затем на SO. : D – MasterOdin

+0

Элегантное использование результирующего объекта, как оно. –

0

У вас есть две возможности узнать, существует ли определенная строка.

Метод один подсчитывает количество совпадающих строк с SQL:

$q5 = "SELECT COUNT(*) AS number_of_subjects FROM subjects WHERE name='$sn'"; 
$r5 = @mysqli_query($dbc, $q5); 

$row = mysqli_fetch_assoc($r5); 

if ($row['number_of_subjects'] > 0) { 
    ... 
} else { 
    ... 
} 

Метод два подсчитывает число результирующего набора с mysqli_num_rows:

$q5 = "SELECT * AS number_of_subjects FROM subjects WHERE name='$sn'"; 
$r5 = @mysqli_query($dbc, $q5); 

$number = mysqli_num_rows($r5); 

if ($number) { 
    ... 
} else 
    ... 
} 
Смежные вопросы