Проверка перед записью в бд

bapmak

Новичок
Люди добрые помогите. Есть запрос

$number = $_POST['number'];
$datetime = $_POST['datetime'];
$dept = $_POST['dept'];
$text = $_POST['text'];
$disp = $_POST['disp'];

$serverName = "172.28.42.19";
$connectionInfo = array( "Database"=>"test", "UID"=>"Supervisor", "PWD"=>"Supervisor");
$conn = sqlsrv_connect( $serverName, $connectionInfo );
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}
$sql = "INSERT INTO jOrdersJounal1 (Num, begin_dts, dept, note, disp)
VALUES ('$number', '$datetime', '$dept', '$text', '$disp')";

$stmt = sqlsrv_query( $conn, $sql);
if( $stmt === true) {
die( print_r( sqlsrv_errors(), true) );
}
sqlsrv_free_stmt( $stmt);

который через форму получает данные и записывает их в бд. Как реализовать чтобы, по полю "Num"-(туда записывается номер нарушения, цифрами) проходила проверка, если такие данные в поле Num уже есть то выходила бы ошибка типа "Данный номер для записи уже занят", а если таких данных нет, проходила запись новых данных в бд
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ну как вариант - посмотреть есть ли там уже данные. То есть сделать выборку, где ты выяснишь этот критерий. SELECT xxx FROM ... и так далее.
 

bapmak

Новичок
Ну как вариант - посмотреть есть ли там уже данные. То есть сделать выборку, где ты выяснишь этот критерий. SELECT xxx FROM ... и так далее.
Смотри написал так, говорю сразу, я только учусь, понимаю что неправильно и есть касяк тас как оно не работает, как правильно написать проверку перед вставкой?


$sql_chek="SELECT * FROM `jOrdersJounal1` WHERE `num`= '".$number."'";
$rs_chek= sqlsrv_query($conn,$sql);
$row_count= sqlsrv_num_rows($rs_chek);
if($row_count=== false{
echo"Такой номер существует";
}else{
$sql="INSERT INTO jOrdersJounal1 (Num, begin_dts, dept, note, disp)
VALUES ('$number', '$datetime', '$dept', '$text', '$disp')";
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Посмотри какой запрос у тебя получился, выведи на экран и выполни его в базе напрямую, через консоль. Если она есть в SQLServer
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@bapmak, я что сказал? ВЫВЕСТИ ЗАПРОС НА ЭКРАН, потом скопировать и кинуть его в консоль. Я уже вижу, что ты просто написал в консоли его от руки.
 

bapmak

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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ну так сделай тогда, когда все под рукой будет, не надо пытаться доказать, что все работает, если в реальности это не так. Напишешь завтра что вышло.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@bapmak, выведи запрос в браузер (print, echo), чтобы было видно как была интерпретирована строка с ним. Скопируй выведенный запрос и выполни в консоли.
 

Breeze

goshogun
Команда форума
Партнер клуба
@Breeze, пока да, я и хочу сделать запрет этого.
Тогда, помимо проблемы выше подумай вот над чем.

В схеме, что тебе предложили выше, select ... from и последующем insert into есть маленький недостаток: когда пользователей больше одного, то существует ненулевая вероятность того, что будет такая ситуация:
Практически одновременно приходят две формы от разных юзеров, но с одним Num.
юзер1 делает запрос select ... from и получает 0
юзер2 делает запрос select ... from и получает 0
а потом начинается
юзер1 делает insert into -- вставлено, т.к. его селект дал 0
юзер2 делает insert into -- вставлено, т.к. его селект дал 0

Поэтому предлагаю сделать поле Num уникальным, повесив на него соответствующий индекс UNIQUE.
Тогда делая insert без всяких select ты, либо получаешь sqlsrv_rows_affected()>0 , либо ошибку типа Duplicate entry, которую обрабатываешь через sqlsrv_errors() и показываешь юзеру, что его номер не прокатил.
 

bapmak

Новичок
@Breeze, ненулевая вероятность отпадает, данные будут вбиваться с одного пк, а сделать поле Num уникальным не вариант, проблема в том что, к это таблице подключена прога рабочая на дельфе, написанная другим человеком,а мне нужно сделать ее web-клон и какие либо манипуляции с таблицей мне запрещены.
 
Последнее редактирование:
Сверху