Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的MySQL:使用变量和限制准备和执行查询_Php_Mysql_Variables_Prepared Statement - Fatal编程技术网

PHP中的MySQL:使用变量和限制准备和执行查询

PHP中的MySQL:使用变量和限制准备和执行查询,php,mysql,variables,prepared-statement,Php,Mysql,Variables,Prepared Statement,我试图创建一个具有可变限制值的MySQL查询,以便在多个页面上显示表结果。 这不起作用: // Check the page number if (isset($_GET["usPage"])) { $treatedPage = mysql_real_escape_string(strip_tags($_GET["usPage"])); } else { $treatedPage=1; } $start_from = ($treatedPage-1) * 20; //

我试图创建一个具有可变限制值的MySQL查询,以便在多个页面上显示表结果。 这不起作用:

// Check the page number
if (isset($_GET["usPage"])) { 
    $treatedPage  = mysql_real_escape_string(strip_tags($_GET["usPage"])); 
} else { 
    $treatedPage=1; 
}
$start_from = ($treatedPage-1) * 20; 
// Prepare MySQL query with a variable depending on page to display
$req = $DB->prepare('SELECT * FROM Table ORDER BY Id ASC LIMIT :MySQL_start_from, 20');
$req->execute(array(
    'MySQL_start_from' => $start_from
    ));
// Fetch result and display array content
$row = $req->fetch();
echo '<pre>';
print_r($row);
echo '</pre>';
//检查页码
如果(isset($_GET[“usPage”]){
$treatedPage=mysql\u real\u escape\u字符串(strip\u标记($\u GET[“usPage]”));
}否则{
$treatedPage=1;
}
$start_from=($treatedPage-1)*20;
//根据要显示的页面,使用变量准备MySQL查询
$req=$DB->prepare('SELECT*fromtable ORDER BY Id ASC LIMIT:MySQL\u start\u FROM,20');
$req->执行(数组)(
'MySQL\u start\u from'=>$start\u from
));
//获取结果并显示数组内容
$row=$req->fetch();
回声';
打印(行);
回声';

如果将:MySQL\u start\u from替换为0,则可以显示行内容。我认为我的问题来自于查询中的那个变量。注意到任何错误吗?

将PDO设置为非仿真模式

$DB->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
或者使用
bindValue

当从execute PDO直接绑定变量时,会将它们视为字符串,因此您的查询看起来像
ORDER BY Id ASC LIMIT“0',20')
,并导致解析错误

顺便说一下,要得到这些错误的通知,请始终告诉PDO引发异常:

//  right after $DB = new PDO...
$DB->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$DB->setAttribute( PDO::ATTR_EMULATE_PREPARES, FALSE);

// and then with your code
if (isset($_GET["usPage"])) { 
    $treatedPage  = $_GET["usPage"]; 
} else { 
    $treatedPage=1; 
}
$start_from = ($treatedPage-1) * 20; 
// Prepare MySQL query with a variable depending on page to display
$req = $DB->prepare('SELECT * FROM Table ORDER BY Id ASC LIMIT ?, 20');
$req->execute(array($start_from));
// Fetch result and display array content
$row = $req->fetch();
echo '<pre>';
print_r($row);
echo '</pre>';
当然,您必须同时去掉
mysql\u real\u escape\u string
strip\u标记
,因为它们在这里是无用的

所以最后的代码是

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM table ORDER BY :sort :dir LIMIT :start, :results";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':start', $_GET['start'], PDO::PARAM_INT);
$stmt->bindParam(':results', $_GET['results'], PDO::PARAM_INT); 
//就在$DB=new PDO之后。。。
$DB->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常);
$DB->setAttribute(PDO::ATTR_EMULATE_PREPARES,FALSE);
//然后用你的代码
如果(isset($_GET[“usPage”]){
$treatedPage=$\u GET[“usPage”];
}否则{
$treatedPage=1;
}
$start_from=($treatedPage-1)*20;
//根据要显示的页面,使用变量准备MySQL查询
$req=$DB->prepare('SELECT*FROM Table ORDER BY Id ASC LIMIT?,20');
$req->execute(数组($start_from));
//获取结果并显示数组内容
$row=$req->fetch();
回声';
打印(行);
回声';

试着以两种方式使用:


你的意思是要设置分页?为什么要使用
mysql\u real\u escape\u string
和PDO?不需要。另外,对于这个计算,首先将它转换为int,如果失败,则将它设置为1…@Devang Rathod:事实上,如果你有更好的解决方案,请继续。但是,即使有最好的方法,我感兴趣的是理解为什么我的代码在这里不起作用…;-)@是的,这是一个更好的解决方案,我会考虑的,谢谢!这有什么问题吗?OK,我明天会试试,获取关于setAttribute函数的信息,这似乎很重要。无论如何谢谢你!关于mysql\u real\u escape\u string和strip\u标记,我是否应该保护usPage变量不受通过URL的代码注入的影响?
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM table ORDER BY :sort :dir LIMIT :start, :results";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':start', $_GET['start'], PDO::PARAM_INT);
$stmt->bindParam(':results', $_GET['results'], PDO::PARAM_INT);