У меня есть сценарий php, и я думаю, что у этого много ошибок. из-за моих ограниченных знаний в конкатенации и SQL-инъекции. В первый раз у меня нет проблем, потому что этот скрипт использует PHP-Mysql.
Но после того, как я попытаюсь перейти на Interbase, я встречаю много неприятностей. Пожалуйста, помогите определить мою ошибку.
этот мой следующий запрос:
$sLimit = ""; if ( isset( $_POST['iDisplayStart'] ) ) { $sLimit = " FIRST ".$_POST['iDisplayStart']." SKIP ".$_POST['iDisplayLength']; } $sOrder =""; $sOrder = " ORDER BY LINE_NAME "; $sWhere = ""; if (postVar('sSearch') !="" ) { $sWhere = " WHERE (LINE_NAME LIKE '%".$_POST['sSearch']."%' OR MODEL_ONLY LIKE '%".$_POST['sSearch']."%' OR ". " VER_ONLY LIKE '%".$_POST['sSearch']."%' OR ". " LOT_SIZE LIKE '%".$_POST['sSearch']."%' OR ". " START_SERIAL LIKE '%".$_POST['sSearch']."%' OR ". " SERIAL_NO_LOW LIKE '%".$_POST['sSearch']."%' OR ". " SERIAL_NO_UP LIKE '%".$_POST['sSearch']."%' OR ". " PROD_NO LIKE '%".$_POST['sSearch']."%' OR ". " PROD_DATE LIKE '%".$_POST['sSearch']."%') "; } $sQuery = "SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE FROM DOC_TO".$sWhere.$sOrder.$sLimit.";"; $rResult = ibase_query( $sQuery) or _doError(_ERROR30 . ' (<small>' . htmlspecialchars($sql) . '</small>): ' . ibase_errmsg() ); $sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE FROM DOC_TO'.$sWhere.$sOrder.$sLimit.')"; $rResultFilterTotal = ibase_query( $sQuery) or _doError(_ERROR30 . ' (<small>' . htmlspecialchars($sql) . '</small>): ' . ibase_errmsg() ); $aResultFilterTotal = ibase_fetch_assoc($rResultFilterTotal); $iFilteredTotal = $aResultFilterTotal[0];
примечания: мне нужно больше узнать о конкатенации. Спасибо за продвижение.
ошибка:
Dynamic SQL Error SQL error code = -104 Token unknown - line 3, column 39 '.. ORDER BY LINE_NAME ..'
Похоже, что он может работать, поэтому, если это не удается, пожалуйста, опишите, как это сделать.
Однако в нем есть одна видимая ошибка: в строках
$sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE FROM DOC_TO'.$sWhere.$sOrder.$sLimit.')";
вы начинаете строку с двойными кавычками и пытаетесь прервать строку одиночными кавычками, которая не будет работать. Таким образом, код должен быть:
$sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE FROM DOC_TO".$sWhere.$sOrder.$sLimit.")";
В зависимости от вашей среды, кроме того, в вашем коде есть важный недостаток безопасности: например, в строке
$sLimit = " FIRST ".$_POST['iDisplayStart']." SKIP ".$_POST['iDisplayLength'];
вы используете $ _POST, чтобы поместить его непосредственно в SQL-запрос, который открывает так называемое SQL-инъекционное отверстие безопасности.
я нашел ответ от руководства AndreKR:
$sLimit = ""; if ( isset( $_POST['iDisplayStart'] ) ) { settype($iDisplayStart,'integer'); $iDisplayStart = $_POST['iDisplayStart']; $iDisplayLength = $_POST['iDisplayLength']; $sLimit = sprintf(" FIRST ".$iDisplayStart." SKIP ".$iDisplayLength); }
и измените все $ _POST:
'%".$_POST['sSearch_0']."%' into ''%".$_POST['sSearch_0']."%'' //this to prevent injection For databases Like Oracle, DB2, MS SQL, Firebird
и изменение:
$sQuery = "SELECT COUNT(*) FROM(......) into $sQuery = "SELECT COUNT(*) AS DCOUNT FROM DOC_TO".$sWhere.$sLimit.";"; //delete $sOrder $aResultFilterTotal = ibase_fetch_assoc($rResultFilterTotal); $iFilteredTotal = $aResultFilterTotal['DCOUNT']; //change from ......[0]
и добавить на последней странице php:
ibase_free_result($aResultTotal); ?>