2

I created an array of values from data in MySQL. I then try to print it in Javascript but unfortunately it is not showing up. Database has two cols: gurtej and singh

<?php
require_once('config.php');
function readAttribute($connect){
    $resultArray=array();
    $sql="SELECT Attributename,Entityname FROM temp_data_attribute";
    $res=mysqli_query($connect,$sql);
    echo mysqli_num_rows($res);
    if(mysqli_num_rows($res)==0){
        return 0;
    }
    else{
        while($result=mysqli_fetch_array($res)){
            array_push($resultArray,$result[0]);
        }

        return $resultArray;
    }

}
?>
<html>
<body>
<script>
    var jArray= <?php
$resultArray=readAttribute($connect);
if($resultArray==0){
$resultArray=[];
}
echo json_encode($resultArray);?>;
    var counter=<?php echo count($resultArray);?>;
    document.write(jArray[0]);

</script>
<?php
print_r($resultArray);
?>
</body>
</html>

And when i try to print it in php using print_r this is the result.

Array ( [0] => gurtej [1] => singh )

1
  • Uncaught TypeError: Cannot read property '0' of undefined Commented Mar 12, 2016 at 2:04

3 Answers 3

1

The resulting JavaScript statement includes more than just the var and array as JSON:

var jArray = 2["gurtej","singh"];

The extra 2 comes from the echo within readAttribute() showing the number of rows:

function readAttribute($connect){
    $resultArray=array();
    $sql="SELECT Attributename,Entityname FROM temp_data_attribute";
    $res=mysqli_query($connect,$sql);
    echo mysqli_num_rows($res);
//  ^^^^

By following the number, the "array" changes meaning and is interpreted as a bracket property accessor with a comma operator. The statement behaves the same as:

var jArray = (2).singh;

And, the number 2 doesn't (normally) have a property named singh. So, you get undefined, which can't have properties.

console.log(typeof jArray); // 'undefined'
console.log(jArray[0]);     // TypeError

To remove the 2, you'll want to remove or comment out the additional echo:

function readAttribute($connect){
    $resultArray=array();
    $sql="SELECT Attributename,Entityname FROM temp_data_attribute";
    $res=mysqli_query($connect,$sql);
    // echo mysqli_num_rows($res);
    // ...
}
var jArray = ["gurtej","singh"];

console.log(typeof jArray); // "object"
console.log(jArray[0]);     // "gurtej"
0
0

Let's clean up that function a bit and we'll fix the problem too

function readAttribute($connect){
    $resultArray = array();
    $sql="SELECT Attributename,Entityname FROM temp_data_attribute";
    $res=mysqli_query($connect,$sql);
    //echo mysqli_num_rows($res);

    while($result = mysqli_fetch_assoc($res)){
        $resultArray[] = $result;
    }

    return $resultArray;
}

Your problem is that you were using $result[0], but that just pushes the first column. And if you're going to json_encode this, I would avoid using fetch_array() (without an argument) because it returns both a numeric AND associative key value for each column (which will inflate your data set of rows)

0
0

Lets clean up the code:

<html>
<body>
<!-- container to hold data -->
<div id='container'></div>
<script>
   <?php 
      //--- get the results from the database
      $resultArray=readAttribute($connect);
      //--- convert if necessary
      if($resultArray==0){
         $resultArray=[];
      }
   ?>;
   //--- place results into JavaScript array
   var jArray= <?php echo json_encode($resultArray);?>;
   //--- show the raw array
   document.getElementById('container').innerHTML = jArray[0];
</script>
<?php
print_r($resultArray);
?>
</body>
</html>

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.