Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 PDO截断我准备语句中的SQL字符串,尝试绑定参数编号0?_Php_Sql Server_Pdo_Prepared Statement - Fatal编程技术网

Php PDO截断我准备语句中的SQL字符串,尝试绑定参数编号0?

Php PDO截断我准备语句中的SQL字符串,尝试绑定参数编号0?,php,sql-server,pdo,prepared-statement,Php,Sql Server,Pdo,Prepared Statement,好吧,我花了几天的时间在谷歌上搜索,却什么也没找到。基本上,我使用的是一个预先准备好的语句,它包含基于几个like、IN和FREETEXT的连接和匹配。我正在动态构建查询以支持IN条件。我想一些代码会有帮助 public function searchForProjWithTags(Array $dSearchArgs, $dTags) { $bSplitTags = preg_split ("/[,]/", $dTags); $bCount = count($bSplitTags);

好吧,我花了几天的时间在谷歌上搜索,却什么也没找到。基本上,我使用的是一个预先准备好的语句,它包含基于几个like、IN和FREETEXT的连接和匹配。我正在动态构建查询以支持IN条件。我想一些代码会有帮助

public function searchForProjWithTags(Array $dSearchArgs, $dTags) {
  $bSplitTags = preg_split ("/[,]/", $dTags);

  $bCount = count($bSplitTags);
  $bQuestionMarks = "?" . str_repeat (",?", $bCount-1);

  $bSql = "SELECT DISTINCT Foo.Foo_ID, Foo.Blah1, Foo.Blah2, Foo.Blah3, 
    Foo.Blah4, Foo.Blah5, Foo.Blah6, Foo.Blah7, Foo.Blah8, Foo.Blah9, 
    Foo.Blah10
    FROM Foo INNER JOIN
    TaggedFoo ON Foo.Foo_ID = TaggedFoo.Foo_ID INNER JOIN
    Tag ON TaggedFoo.Tag_ID = Tag.Tag_ID
    WHERE Foo.Blah2 LIKE ?
      AND Foo.Blah3 LIKE ?
      AND Foo.Blah4 LIKE ?
      AND Foo.Blah5 LIKE ?
      AND Foo.Blah6 LIKE ?
      AND Foo.Blah7 LIKE ?";

  if($dSearchArgs["Blah8"] != "") {
    $bSql .= "AND FREETEXT (Foo.Blah8, ?)";
  }

  $bSql .= "AND Tag.Tag_ID IN (" . $bQuestionMarks . ")
      ORDER BY Foo.Blah2 ASC,
      Foo.Blah3 ASC,
      Foo.Blah5 ASC";

  if(!$bStmt = $this->getPDO()->prepare($bSql)) {
    print_r($this->getPDO()->errorInfo());
  }


  $bStmt->bindValue(1, "%" . $dSearchArgs ["Blah2"] . "%");
  $bStmt->bindValue(2, "%" . $dSearchArgs ["Blah3"] . "%");
  $bStmt->bindValue(3, "%" . $dSearchArgs ["Blah4"] . "%");
  $bStmt->bindValue(4, "%" . $dSearchArgs ["Blah5"] . "%");
  $bStmt->bindValue(5, "%" . $dSearchArgs ["Blah6"] . "%");
  $bStmt->bindValue(6, "%" . $dSearchArgs ["Blah7"] . "%");
  if($dSearchArgs["Blah8"] != "") {
    $bStmt->bindValue(":s", $dSearchArgs["Blah8"]);
  }
  for($i = 0; $i < $bCount; $i ++) {
    $bStmt->bindValue (7 + $i, $bSplitTags [$i]);
  }
  echo "<br><br>" . $bSql . "<br><br>";
  $bStmt->debugDumpParams();
  if(!$bStmt->execute()) {
    print_r($bStmt->errorInfo());
  }

  return $bStmt->fetchAll(PDO::FETCH_ASSOC);
}
公共函数searchForProjWithTags(数组$dSearchArgs,$dTags){
$bSplitTags=预分割(“/[,]/”,$dTags);
$bCount=计数($bSplitTags);
$bQuestionMarks=“?”.str_repeat(“,?”,$bCount-1);
$bSql=“选择不同的Foo.Foo_ID、Foo.Blah1、Foo.Blah2、Foo.Blah3,
Foo.Blah4,Foo.Blah5,Foo.Blah6,Foo.Blah7,Foo.Blah8,Foo.Blah9,
Foo.Blah10
从Foo内部连接
taggedfooon Foo.Foo_ID=TaggedFoo.Foo_ID内部联接
Tag ON TaggedFoo.Tag_ID=Tag.Tag_ID
你喜欢什么?
还有Foo.Blah3什么的?
还有福什么的?
还有福,什么样的?
还有福什么的?
还有福,诸如此类?”;
如果($dSearchArgs[“Blah8”]!=”){
$bSql.=“和自由文本(Foo.Blah8,?)”;
}
$bSql.=”和Tag.Tag_ID(“.$bQuestionMarks.”)
Foo.Blah2 ASC订购,
Foo.Blah3 ASC,
Foo.Blah5 ASC”;
如果(!$bStmt=$this->getPDO()->prepare($bSql)){
打印($this->getPDO()->errorInfo());
}
$bStmt->bindValue(1,“%”,$dSearchArgs[“Blah2”]。“%”;
$bStmt->bindValue(2,“%”,$dSearchArgs[“Blah3”]。“%”);
$bStmt->bindValue(3,“%”,$dSearchArgs[“Blah4”]。“%”);
$bStmt->bindValue(4,“%”,$dSearchArgs[“Blah5”]。“%”);
$bStmt->bindValue(5,“%”,$dSearchArgs[“Blah6”]。“%”);
$bStmt->bindValue(6,“%”,$dSearchArgs[“Blah7”]。“%”);
如果($dSearchArgs[“Blah8”]!=”){
$bStmt->bindValue($s“,$dSearchArgs[“Blah8”]);
}
对于($i=0;$i<$b计数;$i++){
$bStmt->bindValue(7+$i,$bSplitTags[$i]);
}
回声“

”$bSql。”

”; $bStmt->debugDumpParams(); 如果(!$bStmt->execute()){ 打印($bStmt->errorInfo()); } 返回$bStmt->fetchAll(PDO::FETCH_ASSOC); }
所以,我在最后有一些探测器,这样我可以看到发生了什么。以下是它们的结果:$bSql的echo给出了整个SQL字符串,即应该发送给DBMS的内容。但是,debugDumpParams()将语句切掉在字符433处,它的字面结尾类似于“…和Foo.Blah3 L”。我不知道为什么它会截断字符433之后,在中间(没有特殊字符等)。< /P> 第二个打印表示数组([0]=>IMSSP[1]=>-29[2]=>尝试绑定参数号0。SQL Server最多支持2100个参数)。我不知道这意味着什么,谷歌也帮不了什么忙

有人知道为什么会这样吗?我已经花了好几个小时试图找到一些东西,甚至都没有靠近。如果我手动运行查询,它就会工作


作为参考,我使用PHP版本5.4.21、Apache 2.4.6、PHP_pdo_sqlsrv_54_ts.dll作为我的pdo驱动程序,以及Microsoft SQL Server 2012。

请提供一个函数参数示例,以便我们可以测试运行它。$aSearchArgs=array(“blah2”=>$POST[“blah2”],“blah3”=>$POST[“blah3”],“blah4”=>$POST[“blah4”],“blah5”=>$发布[“blah5”],“blah6”=>$发布[“blah6”],“blah7”=>$发布[“blah7”],“blah8”=>$发布[“blah8”];如果(!empty($_POST[“tags”]){$aTags=内爆(“,”,$_POST[“tags”]);$aRs=searchForProjWithTags($aSearchArgs,$aTags);}那么这看起来像是废话。。。这两个参数都是一个数组$ASEARCARGS是长度在1到5个字符之间的字符串的关联数组(表中的字段为nvarchar(50))$aTags是一个整数数组。下面是一些实际的测试数据:$ASEARCARGS=array(“blah2”=>“R”,“blah3”=>“X”,“blah4”=>“47”,“blah5”=>“O”,“blah6”=>“23829”,“blah7”=>“AB”,“blah8”=>“这是一些测试文本”)$aTags=数组(1,2,3,4);我想出来了。当我将所有内容都更改为问号时,我忘记更改自由文本搜索的if条件中的:s。我所做的是把$j=0放在那个条件之前,把$j=1放在那个条件下。然后我在for循环中将bindValue设置为7+$I+$j。那个愚蠢的错误花了我几个小时。希望这能帮助其他犯错误的人。仔细检查你的代码。