Один ложный положительный результат может произойти, если ALTER, CREATE или DROP происходят в строковой константе.
INSERT INTO News (headline) VALUES ('Stocks DROP for no reason!');
Также strpos()
ищет только литеральные подстроки, он не знает, является ли подстрока частьюболее длинное слово.
SELECT * FROM CLOTHING_ALTERATIONS
Таким образом, вы можете захотеть использовать регулярное выражение и убедиться, что слово находится в начале выражения и является целым словом.
$num_matches = preg_match("/^\s*(ALTER|CREATE|DROP|RENAME)\b/m", $sql);
Использование многострочного соответствия регулярному выражению важно, если строка содержит комментарий строки SQL.
-- the following statement is run in my add_column() function
ALTER TABLE mytable ADD COLUMN ...
Это может быть еще более сложным, поскольку многие реализации SQL допускают /* */
в качестве разделителей для встроенных комментариев .
/* added 12/7/2011 */ CREATE /* TEMPORARY */ TABLE mytable ...