Php 奇怪的MySQL通配符行为
我遇到了一个奇怪的行为,我在PHP代码中无法理解它 使用此代码(暂时省略全部内容)-->Php 奇怪的MySQL通配符行为,php,mysql,wildcard,Php,Mysql,Wildcard,我遇到了一个奇怪的行为,我在PHP代码中无法理解它 使用此代码(暂时省略全部内容)--> $searchFor由用户输入定义,并通过AJAX请求发送。结果作为$tvLine存储在$result中。然后,它以html格式显示,带有$tvLine['showName'] 现在让我们假设我正在寻找ss.showName“Joni和朋友”。。。 如果我在“Joni and”中输入任意数量的字母,我会得到正确的结果-->“Joni and Friends” 同样,如果我在“Friends”中输入任意数量的
$searchFor
由用户输入定义,并通过AJAX请求发送。结果作为$tvLine
存储在$result
中。然后,它以html格式显示,带有$tvLine['showName']代码>
现在让我们假设我正在寻找ss.showName“Joni和朋友”。。。
如果我在“Joni and”中输入任意数量的字母,我会得到正确的结果-->“Joni and Friends”
同样,如果我在“Friends”中输入任意数量的字母,我会得到正确的结果-->“Jonie and Friends”
但是,如果我只键入“F”或“F”,我将不会收到任何结果
为什么会这样
多谢各位
if ( isset($_GET['userInput'])) {
$searchFor = $_GET['userInput']; // the actual user search content
$searchDate = $_GET['sDate']; // ascertains the correct day for search
$searchTz = $_GET['sTz']; // ascertains the correct timezone for search
// conditional statement to check time difference for MySQL
if ($searchTz == "UK"){ $searchTz = 0;}
else { $searchTz = 5; }
global $wpdb;
$now = date("Y-m-d H:i:s");
$params = array($now);
$sql = "SELECT se.*, ss.showName, TIMEDIFF(NOW(), UTC_TIMESTAMP) as server_date
FROM showpress_episodes
AS se LEFT JOIN showpress_shows AS ss
ON se.showId=ss.id
WHERE ss.showName LIKE '%".$searchFor."%'
AND DATE(episodeStartTime) = CURRENT_DATE() + INTERVAL $searchDate DAY
AND episodeStartTime >= NOW() - INTERVAL $searchTz HOUR
ORDER BY episodeStartTime
";
$result = $wpdb->get_results($wpdb->prepare($sql, $params), ARRAY_A);
?>
<h2>Search Results <a id="search_close" onclick="closeForm()">X</a></h2>
<?php
// create table to hold SQL
if (count($result) < 1){
echo ('<p>
<table border="0">
<tr><td>Show Name</td></tr>
<tr ><td colspan="3">NO RESULTS </td> </tr>
<tr><td>'.$searchFor.'</tr></td>
</table>');
}
else{
$display_string .= '<p>
<table border="0" id="ajax-table">';
//$display_string .= "<tr><td>".$searchFor."</tr></td>";
foreach ($result as $tvLine) {
$display_string .= "<tr><td>";
//$display_string .= $tvLine[server_date];
$display_string .= "<a id='". $tvLine[id] ." 'class='pointer search now-playing'>".$tvLine['showName']."</a>";
$display_string .= "</td></tr>";
}
$display_string .= "</table></p>";
}
echo $display_string;
exit();
if(isset($\u GET['userInput'])){
$searchFor=$\u GET['userInput'];//实际的用户搜索内容
$searchDate=$\u GET['sDate'];//确定搜索的正确日期
$searchTz=$\u GET['sTz'];//确定用于搜索的正确时区
//用于检查MySQL时差的条件语句
如果($searchTz==“UK”){$searchTz=0;}
else{$searchTz=5;}
全球$wpdb;
$now=日期(“Y-m-d H:i:s”);
$params=array($now);
$sql=“选择se.*、ss.showName、TIMEDIFF(现在()、UTC时间戳)作为服务器日期
选自showpress_剧集
如se所示,左侧连接showpress_如ss所示
在se.showId=ss.id上
其中ss.showName类似“%”“$searchFor.”
和日期(EpicodeStartTime)=当前日期()+间隔$searchDate天
和eposodestarttime>=NOW()-间隔$searchTz小时
按时间顺序排列
";
$result=$wpdb->get_results($wpdb->prepare($sql,$params),ARRAY_A);
?>
搜索结果X
你应该读到:
代码应该是这样的(未经测试,我没有wordpress可供测试):
你应该读到:
代码应该是这样的(未经测试,我没有wordpress可供测试):
您的代码存在SQL注入的风险。您应该尽快更正此问题。输出最终的、完全转义的查询和检查。我怀疑您正在某个地方通过类似sprintf的方式运行它,并且%F被视为一个控制字符。在这一点上,查看代码将有助于我们回答此问题。添加的代码:好。我认为控制字符问题必须是be当我在开始处添加第二个%时发生了什么..然后搜索功能正常。如果你能解释的话,我想我不理解控制字符。谢谢你的代码有SQL注入的风险。你应该尽快更正此问题。输出最终的、完全转义的查询和检查。我怀疑你正在通过类似sp的东西运行它rintf某处,并且%F被视为一个控制字符。在这里查看代码可以帮助我们回答。添加的代码:好的。我认为控制字符问题一定是在我在开头添加第二个%时发生的。然后搜索功能正常。如果你能解释的话,我想我不理解控制字符。谢谢
if ( isset($_GET['userInput'])) {
$searchFor = $_GET['userInput']; // the actual user search content
$searchDate = $_GET['sDate']; // ascertains the correct day for search
$searchTz = $_GET['sTz']; // ascertains the correct timezone for search
// conditional statement to check time difference for MySQL
if ($searchTz == "UK"){ $searchTz = 0;}
else { $searchTz = 5; }
global $wpdb;
$now = date("Y-m-d H:i:s");
$params = array($now);
$sql = "SELECT se.*, ss.showName, TIMEDIFF(NOW(), UTC_TIMESTAMP) as server_date
FROM showpress_episodes
AS se LEFT JOIN showpress_shows AS ss
ON se.showId=ss.id
WHERE ss.showName LIKE '%".$searchFor."%'
AND DATE(episodeStartTime) = CURRENT_DATE() + INTERVAL $searchDate DAY
AND episodeStartTime >= NOW() - INTERVAL $searchTz HOUR
ORDER BY episodeStartTime
";
$result = $wpdb->get_results($wpdb->prepare($sql, $params), ARRAY_A);
?>
<h2>Search Results <a id="search_close" onclick="closeForm()">X</a></h2>
<?php
// create table to hold SQL
if (count($result) < 1){
echo ('<p>
<table border="0">
<tr><td>Show Name</td></tr>
<tr ><td colspan="3">NO RESULTS </td> </tr>
<tr><td>'.$searchFor.'</tr></td>
</table>');
}
else{
$display_string .= '<p>
<table border="0" id="ajax-table">';
//$display_string .= "<tr><td>".$searchFor."</tr></td>";
foreach ($result as $tvLine) {
$display_string .= "<tr><td>";
//$display_string .= $tvLine[server_date];
$display_string .= "<a id='". $tvLine[id] ." 'class='pointer search now-playing'>".$tvLine['showName']."</a>";
$display_string .= "</td></tr>";
}
$display_string .= "</table></p>";
}
echo $display_string;
exit();
global $wpdb;
//$now = date("Y-m-d H:i:s");
$params = array("%".$searchFor."%", $searchDate, $searchTz);
$sql = "SELECT se.*, ss.showName, TIMEDIFF(NOW(), UTC_TIMESTAMP) as server_date
FROM showpress_episodes
AS se LEFT JOIN showpress_shows AS ss
ON se.showId=ss.id
WHERE ss.showName LIKE %s
AND DATE(episodeStartTime) = CURRENT_DATE() + INTERVAL %d DAY
AND episodeStartTime >= NOW() - INTERVAL %d HOUR
ORDER BY episodeStartTime
";
$result = $wpdb->get_results($wpdb->prepare($sql, $params), ARRAY_A);