2015-09-03 1 views
0

У меня есть следующие строки:связывают отсчет пар первого аргумент

$formatsArray = $_POST['formats']; 
$topicsArray = $_POST['topics']; 


// Converting the array into individual strings 
$formats = implode(",", $formatsArray); 
$topics = implode(",", $topicsArray); 


    // Prepare the statement 
    $resources = $con->prepare("SELECT * FROM resources WHERE 
      (format IN (?)) 
      AND (topic IN (?))"); 

    // Bind the statement 
    $resources->bind_param('ss',$formats, $topics); 

Проблема заключается в том, что темы, полученные из массива, в котором он может содержать несколько строки, но «s» будет распознавать только 1. Я хотел бы, что если в массиве topic имеется 10 записей, чем 10, а также для формата.

Я думаю о подсчете размера массива и добавлении s на каждой итерации, но не знаю, как это сделать. Любая помощь будет оценена по достоинству.

// Count array 
    $formatCount = count($formatsArray); 
    $topicCount = count($topicsArray); 
+1

не opssible. заполнители представляют значения ** SINGLE **. строка csv 'a, b, c', заполненная в заполнителе, не будет трех отдельных вещей для' in' для рассмотрения, это будет '... IN ('a, b, c')' - a одно значение. вы должны динамически строить строку запроса и вводить столько «?», как у вас есть значения, или использовать что-то еще полностью. –

+1

Вы привязываете отдельные значения к каждому заполнителю '?' .... поэтому массив значений не будет связываться с одним заполнителем –

+0

возможным дублированием [преобразования массива в отдельные строки] (http://stackoverflow.com/questions/32302633/convert-an-array-in-individual-strings) – chris85

ответ

1

Как об этом потом:

<?php 
    $con = new mysqli("localhost", "USERNAME", "PASSWORD", "DATABASE"); 

    $formatsArray = array('a','b','c','d',); 
    $topicsArray = array('x','y','z',); 

    $sql = 'SELECT * FROM resources WHERE (format IN (FORMAT_REPLACE_ME)) AND (topic IN (TOPIC_REPLACE_ME))'; 

    $formatsPlaceholders = makePlaceHolders($formatsArray); 
    $topicsPlaceholders = makePlaceHolders($topicsArray); 

    $sql = str_replace('FORMAT_REPLACE_ME', $formatsPlaceholders, $sql); 
    $sql = str_replace('TOPIC_REPLACE_ME', $topicsPlaceholders, $sql); 

    //error_log(print_r($sql,1).' '.__FILE__.' '.__LINE__,0); 

    try { 
     $s = $con->prepare($sql); 

     $vals = array_merge($formatsArray, $topicsArray); 

     // from http://stackoverflow.com/a/31562035/1814739 
     $typDfs = str_repeat('s' , count($vals)); 
     $params = array($typDfs); 
     foreach ($vals as $k => $v) { 
      ${ 'varvar' . $k } = $v; 
      $params[] = &${ 'varvar' . $k }; # provide references 
     } 
     call_user_func_array(array($s, 'bind_param') , $params); 

     $s->execute(); 

     $output = array(); 
     $res = $s->get_result(); 
     while ($row = $res->fetch_array(MYSQLI_NUM)) 
     { 
      //error_log(print_r($row,1).' '.__FILE__.' '.__LINE__,0); 
      $output []= array(
       'id' => $row[0], 
       'format' => $row[1], 
       'topic' => $row[2], 
      ); 
     } 

     $s->close(); 

     sanitize_output($output); 
    } 
    catch (\Exception $e) { 
     error_log(print_r($e->getMessage(),1).' '.__FILE__.' '.__LINE__,0); 
    } 

    function makePlaceHolders($arr){ 
     $ph = ''; 
     for ($i = 1; $i <= count($arr); $i++) { 
      $ph .= '?,'; 
     } 
     return rtrim($ph,','); 
    } 

    function sanitize_output(array &$arr, array $args=array()) { 
     array_walk_recursive($arr,'so',$args); 
    } 
    function so(&$v,$k,$args) { 
     $excludes = isset($args['excludes']) ? $args['excludes'] : array(); 
     if (!in_array($k,$excludes)) { 
      $v = trim($v); 
      $v = (get_magic_quotes_gpc()) ? stripcslashes($v) : $v; 
      $v = htmlspecialchars($v); 
     } 
    } 
?> 
<html> 
<body> 
    <ul> 
     <?php foreach($output as $k => $o) { ?> 
     <li><?php echo $o['id']; echo $o['format']; echo $o['topic']; ?></li> 
     <?php } ?> 
    </ul> 
</body> 
</html> 
+0

спасибо за ответ. Я использую mysqli как против pdo – John

+1

Прохладный человек, я могу копать. – ooXei1sh

Смежные вопросы