Здесь четыре поля: oprid, oprname, empid, а другое поле – электронная почта. Я хочу искать oprid, oprname, empid или email, но он не работает,
Предупреждение: oci_fetch_array (): ORA-24374: определение не выполняется до извлечения или выполнения и выборки
<?php { include ('connection.php'); if(isset($_REQUEST['submit'])){ $optid = $_POST['OPRID']; $optdec = $_POST['OPRDEFNDESC']; $empid = $_POST['EMPLID']; $empmail = $_POST['EMAILID']; $query ="SELECT * FROM OPERATOR WHERE OPRID LIKE '%".$optid."%' or OPRDEFNDESC LIKE '%".$optdec."%' or EMPLID LIKE '%".$empid."%' or EMAILID LIKE '%".$empmail."%' "; } else{ $query="SELECT * FROM OPERATOR"; $objParse = oci_parse ($ora_conn, $query); } ?> <form action="multi.php" method="get" action="<?=$_SERVER['SCRIPT_NAME'];?>"> <table width="500" border="0" align="center"> <tr> <th>Operator ID <input name="OPRID" type="text" id="OPRID" value="";> <tr> <th>Operator Name <input name="OPRDEFNDESC" type="text" id="OPRDEFNDESC" value="";> <tr> <th>Person ID <input name="EMPLID" type="text" id="EMPLID" value="";> <tr> <th>Email ID <input name="EMAILID" type="text" id="EMAILID" value="";> <input type="submit" value="Search"></th> </tr> </table> </form> <table> <tr> <td>Operator ID</td> <td>Operator Name</td> <td>Person ID</td> <td>Email ID</td> </tr> <? while($objResult = oci_fetch_array($objParse, OCI_RETURN_NULLS+OCI_ASSOC)) { ?> <tr> <td><div align="center"><?=$objResult["OPRID"];?></div></td> <td><?=$objResult["OPRDEFNDESC"];?></td> <td><?=$objResult["EMPLID"];?></td> <td><div align="center"><?=$objResult["EMAILID"];?></div></td> <td align="center"><a href="Optr_Edit.php?OprID=<?=$objResult["OPRID"];?>">Edit</a> </td> </tr> <? } ?> </table> <? oci_free_statement($objParse); oci_close($ora_conn); } ?> </body> </html>
Запрос должен быть выполнен, прежде чем вы сможете попробовать получить строки. oci_parse()
не выполняет данный запрос.
Добавьте вызов выполнения перед извлечением:
$success = oci_execute($objParse);
Кроме того, в первом блоке вашего if
вы не вызываете oci_parse()
. Он называется только в else
. Измените вызов oci_parse()
для всех условий.
Ваш запрос уязвим для SQL Injection, потому что вы объединяете в него необработанные данные POST. Чтобы предотвратить SQL Injection, используйте связанные параметры:
$optid = '%' . $_POST['OPRID'] . '%'; $optdec = '%' . $_POST['OPRDEFNDESC']. '%'; $empid = '%' . $_POST['EMPLID']. '%'; $empmail = '%' . $_POST['EMAILID']. '%'; $query ="SELECT * FROM OPERATOR WHERE OPRID LIKE :optid or OPRDEFNDESC LIKE '%:optdec%' or EMPLID LIKE :empid or EMAILID LIKE :empemail "; $objParse = oci_parse ($ora_conn, $query); oci_bind_by_name($objParse, ':optid', $optid); oci_bind_by_name($objParse, ':optdec', $optdec); oci_bind_by_name($objParse, ':empid', $empid); oci_bind_by_name($objParse, ':empemail', $empemail); $success = oci_execute($objParse);