Повторите запись ntimes на основе значения счетчика в XSLT 1.0 [дубликат]

PDO не очень хорош с такими вещами. Вам нужно создать строку с вопросительными знаками динамически и вставить в запрос.

$in  = str_repeat('?,', count($in_array) - 1) . '?';
$sql = "SELECT * FROM my_table WHERE my_value IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($in_array);
$data = $stm->fetchAll();

Если в запросе есть другие заполнители, вы можете использовать следующий подход (код берется из моего PDO tutorial ):

Вы можете использовать функцию array_merge(), чтобы объединить все переменные в один массив, добавив другие переменные в виде массивов в том порядке, в каком они появляются в вашем query:

$arr = [1,2,3];
$in  = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE foo=? AND column IN ($in) AND bar=? AND baz=?";
$stm = $db->prepare($sql);
$params = array_merge([$foo], $arr, [$bar, $baz]);
$stm->execute($params);
$data = $stm->fetchAll();

Если вы используете именованные заполнители, код будет немного сложнее, так как вам нужно создать последовательность именных заполнителей, например :id0,:id1,:id2. Таким образом, код будет выглядеть следующим образом:

// other parameters that are going into query
$params = ["foo" => "foo", "bar" => "bar"];

$ids = [1,2,3];
$in = "";
foreach ($ids as $i => $item)
{
    $key = ":id".$i;
    $in .= "$key,";
    $in_params[$key] = $item; // collecting values into key-value array
}
$in = rtrim($in,","); // :id0,:id1,:id2

$sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar";
$stm = $db->prepare($sql);
$stm->execute(array_merge($params,$in_params)); // just merge two arrays
$data = $stm->fetchAll();

К счастью, для названных заполнителей нам не обязательно следовать строгий порядок, поэтому мы можем объединить наши массивы в любом порядке.

0
задан sukra 25 February 2019 в 00:16
поделиться

1 ответ

Вы можете решить эту проблему, используя рекурсивный шаблон с обратным отсчетом от MaxCount до 0 (здесь шаблон называется loop). Настройте этот скелет в соответствии со своими потребностями.

<xsl:template name="loop">
    <xsl:param name="cnt" />
    <xsl:if test="$cnt > 0">
      <NLoop>
        <Number>9</Number>
      </NLoop>      
      <xsl:call-template name="loop">
        <xsl:with-param name="cnt" select="$cnt - 1" />
      </xsl:call-template>
    </xsl:if>  
</xsl:template>

Затем вызовите этот шаблон в конце вашего основного шаблона:

<xsl:template match="/s0:Root">
    <ns0:Root>
      <Detail>
        <xsl:for-each select="Detail/Member">
          <Member>
            <CompanyName>
              <xsl:value-of select="CompanyName/text()" />
            </CompanyName>
            <PersonName>
              <xsl:value-of select="PersonName/text()" />
            </PersonName>
            <State>
              <xsl:value-of select="State/text()" />
            </State>
            <Country>
              <xsl:value-of select="Country/text()" />
            </Country>
            <Amount>
              <xsl:value-of select="Amount/text()" />
            </Amount>
            <CombinedState>
              <xsl:value-of select="CombinedState/text()" />
            </CombinedState>
          </Member>
        </xsl:for-each>
      </Detail>
      <!-- Call the 'loop' template -->
      <xsl:call-template name="loop">
        <xsl:with-param name="cnt" select="MaxCount" />
      </xsl:call-template>
    </ns0:Root>
</xsl:template>

Результат будет по желанию.

0
ответ дан zx485 25 February 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: