PCRE не поддерживает синтаксис \uXXXX
. Вместо этого используйте \x{XXXX}
. См. здесь .
Ваш диапазон \u2e80-\u9fff
также эквивалентен
\p{InCJK_Radicals_Supplement}\p{InKangxi_Radicals}\p{InIdeographic_Description_Characters}\p{InCJK_Symbols_and_Punctuation}\p{InHiragana}\p{InKatakana}\p{InBopomofo}\p{InHangul_Compatibility_Jamo}\p{InKanbun}\p{InBopomofo_Extended}\p{InKatakana_Phonetic_Extensions}\p{InEnclosed_CJK_Letters_and_Months}\p{InCJK_Compatibility}\p{InCJK_Unified_Ideographs_Extension_A}\p{InYijing_Hexagram_Symbols}\p{InCJK_Unified_Ideographs}
Не забудьте добавить u
(/regex here/u
), если вы имеете дело с UTF-8. Если вы имеете дело с другой многобайтовой кодировкой, вы должны сначала преобразовать в UTF-8.
Ваш код создает условие гонки, если два человека пытаются создать один и тот же амед одновременно, и вы неправильно обрабатываете выпад.
Если вы установили столбец SERVER_NAME
в UNIQUE
, тогда вам не нужно проверять наличие имени сервера, прежде чем выполнять свой INSERT
, поскольку MySQL сделает это за вас. Используйте INSERT IGNORE
объявление, чтобы проверить количество затронутых строк после выполнения запроса, чтобы выяснить, работает ли он:
//Create connection to database using mysqli
$conn = new mysqli($dbhost, $dbuser, $dbpass, $db);
//Set variables according to user input on previous form
$Server_Name = $_POST['Server_Name'];
//Define the INSERT statement with IGNORE keyword
$stmt = "INSERT IGNORE INTO dcr_master (Server_Name, Description,..., ... , ... )";
if ($conn->query($stmt) === false) {
die("Database error:".$conn->error);
}
// Check for success
if ($conn->affected_rows == 0) {
print "<br>Error! <p></p>";
echo "" . $Server_Name . " already exists in the DCR";
print "<p></p>Please check the Server Name and try again";
} else {
//Success and return new id
echo "<br><p></p>Record Added!<p></p>";
echo "New id: " . $conn->insert_id;
}
Это атомная операция, поэтому нет условия гонки, и она включает только один вызов базы данных.
Я рекомендую вам использовать стиль ООП или процедурный стиль для mysqli_*()
, но не смешивать их. Используются обычные предупреждения об инъекции SQL.
Используйте mysqli_num_rows
$row_cnt = $dupresult->num_rows;
if ($row_cnt > 0) {
echo "There is a matching record";
}else {
//insert into table
}
false
вместо [MySQLi resource]
. Вероятно, вы захотите выбросить Exception
всякий раз, когда запрос завершится с ошибкой.
– Halcyon
23 December 2014 в 22:10
Это утверждение:
if($dupresult = 1)
всегда будет возвращено 1. Сначала вы должны получить первый результат запроса (если он есть):
$row=$dupresult->fetch_array(MYSQLI_NUM);
, а затем сравните результат против NULL:
if(!$row)
$dupresult
- ресурс MySQLi, при нажатии на boolean он всегда будет true
.
– Halcyon
23 December 2014 в 19:35
NULL
, где когда-то литой будет всегда false
. Пожалуйста, удалите ваш downvote.
– kos
23 December 2014 в 19:39
$dupresult
был массивом, возвращаемым чем-то вроде $result->fetch_assoc()
. И я знаю, что вы явно указали, что это был ресурс MySQLi, но, к сожалению, не включил свет. Мои извинения
– kos
23 December 2014 в 21:39