我正在尝试在jTable中实现一个过滤器。下面是jTable过滤演示。
我使用演示提供的jQuery代码成功地将POST数据发送到listAction php脚本。我访问这些数据并将其赋值给$filter变量。我还在字符串前后添加了两个通配符,以告诉MySQL执行全面搜索而不是索引搜索。
$filter = '%';
$filter .= $_POST['name'];
$filter .= '%';
$startIndex = $_GET['jtStartIndex'];
$pageSize = $_GET['jtPageSize'];
$sorting = $_GET['jtSorting'];
然后调用存储过程并传入每个变量。我删除了实际的数据库和过程名,但我验证了它们是正确的。
$mysqli->query("USE data;");
$res = $mysqli->query("CALL proced($startIndex, $pageSize, $filter);");
$res返回false。
调用存储过程绝对有效,因为我有其他功能以这种方式工作。我还有其他的存储过程,它们只是正确地返回0到9条记录。下面是当前的存储过程代码:
CREATE DEFINER=`root`@`localhost` PROCEDURE `proced`(startIndex INTEGER, pageSize INTEGER, filter VARCHAR(255))
BEGIN
SELECT * FROM reports
WHERE `new`=0 AND ReportingName LIKE filter
ORDER BY idReports ASC
LIMIT startIndex, pageSize;
END
在MySQL工作台中传入值工作并且查询返回正确的行:
call proced(
0,
10,
'Art%'
);
但是jTable失败,提示"与服务器通信时发生错误"。
谁能给我指个正确的方向?从MySQL得到一个错误:
if(!$res){
ChromePhp::log($mysqli->error);
die('error ['. $mysqli->error . ']');
}
错误:Unknown column 'Art' in 'field list'
解决方案(从链接复制):
尝试使用不同的引号"Art"作为标识符引号字符是反引号("'")。否则MySQL会"认为"你指向了一个名为"Art"的列。
参见MySQL 5 Documentation
所以只要给传入的String参数加上单引号就可以了:
CALL procedure('$filter');